2011-04-22 3 views
1

Spring Security가 관리하는 사용자 역할을 기반으로 Spring MVC 애플리케이션에서 모델 컨텐츠를 생성하는 데 문제가 있습니다.Spring MVC와 Spring 보안을 이용한 사용자 역할에 기반한 모델 생성하기

내 응용 프로그램 (단순화 된 예)에서는 ROLE_USER 및 ROLE_ADMIN이라는 두 가지 역할을 정의했습니다. 또한 두 개의 개체 목록 (독자는 ADMIN에서만 사용 가능)과 책 (ADMIN과 USER 모두)을 표시하는 페이지가 있습니다.

JSP 페이지의 조건부 표시 목록에는 문제가 없지만 모델을 먼저 준비해야하며 현재 사용자가 ADMIN이 아닌 경우 독자 목록을로드하고 싶지는 않습니다.

자바 코드에서 스프링 EL을 사용하여 사용자가 역할 (hasRole ('ROLE_ADMIN'))을 지정했는지 판단 할 수 있지만 수동으로 해당 코드를 평가할 수있는 방법을 찾지 못했습니다.

컨트롤러 소스 코드에서 Spring EL 핸들러를 호출 할 수있는 방법이 있는가, 아니면 모델을 조건부로 채우는 더 나은 솔루션이 (아키텍처 또는 디자인 패턴 레벨에서) Java 코드에서 직접 역할을 검사하는 것보다 나은가요?

답변

-1

페이지 부분을 조건부로 표시하는 것이 JSP 페이지에 의해 제어되는 경우 컨트롤러에 의해 조건부 채우기가 수행되어야합니다 (JSP 페이지와 컨트롤러가 뷰 레이어에 단단히 결합되어 있기 때문에). 서비스 계층에서 주석을 사용하면 응용 프로그램의 잘못된 계층 (보기 계층 대신 서비스 계층)에서 책임을지게됩니다. 내가 조건부 필요한 역할이 그 세트에 포함되어있는 경우 난 단지 확인해야 모델을 채우려면 다음

/* This is executed once, after user successful login. */ 

Set<String> roles = new HashSet<String>(); 
for (GrantedAuthority authority : authentication.getAuthorities()) { 
    roles.add(authority.getAuthority()); 
} 

session.setAttribute("userRoles", roles); 

:

내 최종 솔루션은 사용자 세션 속성으로 사용자 역할의 설정을 기억을 기반으로 .

Set<String> roles = (Set<String>) session.getAttribute("userRoles"); 
if(roles.contains("ROLE_ADMIN")) { 
    putReadersInModel(model); 
} 

솔루션은 깨끗하고 컨트롤러에 모델을 적절하게 채워야 할 책임이 있다고 생각합니다.

0

한 가지 방법은 모델을 생성 할 때 모든 것을 반환하고 @PostFilter을 사용하여 역할을 기준으로 결과를 필터링하는 것입니다. 이 경로를 따르고 싶지 않다면 컨트롤러가 다른 빈을 호출하여 모델의 특정 부분을 빌드하고 다른 빈이 해당 역할 주석을 첨부하도록 할 수 있습니다. 그러면 사용하지 않을 경우 개체를 만드는 것을 효과적으로 제한 할 수 있습니다.

+0

제안 해 주셔서 감사합니다. 불행히도 두 솔루션 모두 결함이 있습니다. 먼저 성능 컨텍스트에서 문제가 있습니다. 두 번째는 주석 된 메소드를 호출하면 프로그램 흐름을 제어하는 ​​가장 명확한 방법이 아닌 보안 예외가 발생할 수 있습니다. 두 가지 모두 원하는 효과를 제공 할 수 있지만 깨끗한 솔루션을 찾고 있습니다. –

+0

사용자가 올바른 권한을 가지지 않으면 메서드가 실행되지 않고 미리 정의 된 값 (내 경우 빈 목록)을 반환하게하는 주석을 사용하는 것이 좋을 것이라고 생각합니다. 하지만 그건 단지 희망적인 생각 일뿐입니다.) –

관련 문제