2009-05-05 1 views
0

Spring Security 애플리케이션의 GrantedAuthority 객체에 대해서는 걱정이됩니다. 나는 물건을 다루는 좋은 방법을 찾고 있어요. 무엇보다도 사실을 설명하는 데 주저하지 않고 실수를 저질렀다면 큰 도움이 될 것입니다.Spring Security : GrantedAuthority를 ​​다루는 방법에 대한 조언이 필요합니다.

스프링 보안은 GrantedAuthority 인스턴스를 사용하여 애플리케이션의 다른 부분에서 권한 부여 토큰으로 작동합니다.

기본적으로 GrantedAuthority는 자신을 문자열로 나타낼 수 있습니다. 방법이 @Secured ("ROLE_NAME"), 또는 URL의를 사용하여 보호 할 때 스프링 XML 구성 또는를 사용하여을 확보 할 때 요청이 에 프로그래밍 방식 체크의 HttpServletRequest 경우 (에 request.isUserInRole ("ROLE_NAME")) {..} 항상 점검 할 권한을 지정하는 데 사용하는 String입니다.

응용 프로그램의 여러 위치에서 정적 문자열을 사용할 때의 영향에 대해 궁금합니다. 역할 이름이 변경되면 개발자는 모든 이전 문자열을 검색하여 업데이트해야합니다. String을 놓친 경우 컴파일 타임 오류가 발생하지 않으며 런타임에만 문제가 발생합니다.

Spring Security 애플리케이션에서 GrantedAuthority 오브젝트를 처리 할 때 가장 좋은 방법은 무엇입니까? 귀하의 솔루션에는 어떤 장단점이 있습니까?

답변

0

큰 문제는 여기에 없습니다. GrantedAuthority가 키를 변경하는 것은 거의 없습니다. ROLE_A 역할을 지정하지 마십시오.

또한 개인적으로 주석을 통해 XML 보안 구성을 선호합니다. 일반적으로 한 곳에서 관련된 구성을 유지하는 것이 좋은 생각처럼 보입니다.

+0

내가보기에 문제는 응용 프로그램을 테스트하거나 실행하기 전까지는 잘못 입력하고 응용 프로그램을 찾을 수 없다는 점입니다. 컴파일하는 동안 선언적 오류가 변경된 것은 제 책에서 플러스입니다. "관련 구성"을 함께 유지하고 구성과 함께 유지하는 사이에는 항상 균형이 유지됩니다. 예를 들어, 대부분의 경우 테스트, 개발 환경 및 환경에서 구성이 변경되지 않는 주석을 선호합니다. 그래서 스프링 빈에 대한 Hibernate 엔티티와 XML 설정을위한 주석을 사용한다. –

+0

s/변경/경고 –

-1

스프링 및 기타 프레임 워크 (특히 동적 언어의 경우)에서는 "컨벤션 오버 규칙"이 사용됩니다. 역할 이름을 자유롭게 정의 할 수 있다면 훨씬 많은 코드 행이 필요하다는 것을 쉽게 알 수 있습니다.

그래서 규칙을 지키십시오. ROLE_ANONYMOUS, ROLE_ADMIN 및 ROLE_USER의 3 가지 역할을 항상 사용하십시오. 다른 이름이 필요하면 적절하게 이름을 지정하고 모든 경우에 사용하십시오. 문서화가 중요합니다.

단위 테스트도 가져옵니다. 컴파일러에서 오류를 발견하지 못하는 경우 도움이됩니다.

+0

답변 해 주셔서 감사합니다.하지만 혼란 스럽습니다. 컨벤션에 관한 협약은 이것과 전혀 관련이 없으며, 내가 사용하는 모든 장소에서 역할 이름을 구성해야합니다. 컨벤션에 관한 협약 (Convention over configuration)은 컨벤션을 깰 필요가없는 한 무언가를 설정할 필요가 없을 때입니다. 이 세 역할 이름은 일반적으로 사용될 수 있습니다. 하지만 여전히 컴파일 시간 오류가 발생하지 않습니다. 이는 제 불만이었습니다. 단위 테스트는 확실히 좋지만 컴파일러가 선언 한 선언을 사용하지 않는 명백한 이점은 아직 없습니다. 사일런트 오류는 절대로 좋은 일이 아닙니다. 모든 IMHO. :) –

+0

'내가 사용하는 모든 장소에서 역할 이름을 구성해야합니다.'라는 말은 매번 허용되는 역할의 이름을 쓰는 것을 의미합니다. 맞춤법 오류를 수행하지 못하게하는 것은 아무것도 아니며, 새로운 역할 (사용자가 없음)으로 해석되기 쉽습니다. 그런 의미에서'@Secured'를 사용할 때마다 항상 설정을하고 있습니다. –

+0

게시물에는 질문 할 것이 없습니다. –

1

먼저 가능한 한 애플리케이션의 특정 위치 (예 : 요청 시작 부분의 HTTP 인터셉터)에서 수표 만 수행하고 언급 된 방법 중 하나만 사용하십시오. 이는 사용자가 권한을 부여받을 때 정식으로 알 수 있기 때문에 좋은 방법입니다.

가능하지 않은 경우 역할 이름에 enums를 사용하고 열거 형에 대해서만 비교하십시오. 따라서 응용 프로그램에서 모든 용도를 찾으려면 간단한 검색을 사용하십시오.

+0

+1. String/constants/enum을 변경하는 문제는 Spring Security를 ​​사용함에있어 특별한 것이 아닙니다. –

+0

나는 Wicket (프리젠 테이션) 레이어의 Spring (서비스) 레이어와 컴포넌트 보안에서 메소드 보안의 조합을 사용하고 있습니다. 이 아이디어는 레이어 중 하나에서 무언가를 놓친 경우 다른 레이어에서 가장 많이 발생하는 것입니다. 사용자가 실행할 수있는 코드를 실행할 수 없도록하는 위험은 조금씩 증가하지만 그만한 가치가 있다고 생각합니다. –

+0

열거 형을 사용하는 것은 정확하게하고 싶습니다. 그러나 GrantedAuthority 인터페이스가 Comparable을 확장함에 따라 불가능 해 보입니다. 내 열거 형의 결과는'Name clash입니다. A 형의 compareTo (Object) 메소드는 compareable (T) 형이 Comparable 과 같지만 무시합니다. 여기서 A는 내 열거 형의 이름입니다. –