Program Club

Spring Security는 Spring 컨트롤러 메서드에서 @PreAuthorize를 사용할 수 있습니까?

proclub 2020. 10. 29. 20:12
반응형

Spring Security는 Spring 컨트롤러 메서드에서 @PreAuthorize를 사용할 수 있습니까?


Spring Security @PreAuthorize는 Spring 컨트롤러 메소드에서 사용할 수 있습니까 ?


예, 잘 작동합니다.

당신 <security:global-method-security pre-post-annotations="enabled" />...-servlet.xml. 또한 CGLIB 프록시 가 필요 하므로 컨트롤러에 인터페이스가 없어야하거나 proxy-target-class = true.


Spring Security FAQ (강조 표시)를 참조하십시오 .

Spring 웹 애플리케이션에서 디스패처 서블릿에 대한 Spring MVC Bean을 보유하는 애플리케이션 컨텍스트는 종종 기본 애플리케이션 컨텍스트와 분리됩니다. 종종 myapp-servlet.xml이라는 파일에 정의되어 있는데, 여기서“myapp”은 web.xml에서 Spring DispatcherServlet에 할당 된 이름입니다. 응용 프로그램에는 각각 고유 한 격리 된 응용 프로그램 컨텍스트가있는 여러 DispatcherServlet이있을 수 있습니다. 이러한 "하위"컨텍스트의 Bean은 나머지 응용 프로그램에 표시되지 않습니다. “상위”애플리케이션 컨텍스트는 web.xml에서 정의한 ContextLoaderListener에 의해로드되며 모든 하위 컨텍스트에 표시됩니다. 이 상위 컨텍스트는 일반적으로 요소를 포함하여 보안 구성을 정의하는 위치입니다. 결과적으로 이러한 웹 빈의 메소드에 적용된 보안 제약은 적용되지 않습니다. Bean은 DispatcherServlet 컨텍스트에서 볼 수 없기 때문입니다. 선언을 웹 컨텍스트로 이동하거나 보안하려는 Bean을 기본 애플리케이션 컨텍스트로 이동해야합니다.

일반적으로 개별 웹 컨트롤러보다는 서비스 계층에서 메서드 보안을 적용하는 것이 좋습니다.

서비스 레이어에 포인트 컷을 적용하는 경우 <global-method-security>앱의 보안 컨텍스트 에서만 설정하면됩니다 .


Spring 3.1을 사용한다면 이것으로 꽤 멋진 일을 할 수 있습니다. https://github.com/mohchi/spring-security-request-mapping을 살펴보십시오 . @PreAuthorize를 Spring MVC의 RequestMappingHandlerMapping과 통합하여 다음과 같은 작업을 수행 할 수있는 샘플 프로젝트입니다.

@RequestMapping("/")
@PreAuthorize("isAuthenticated()")
public String authenticatedHomePage() {
    return "authenticatedHomePage";
}

@RequestMapping("/")
public String homePage() {
    return "homePage";
}

사용자가 인증 된 경우 "/"요청은 authenticatedHomePage ()를 호출합니다. 그렇지 않으면 homePage ()를 호출합니다.


이 질문은 질문 때문이 아니라 내가 차라리 사용 억제 것 오늘 한 문제 이후는 2 년 동안의 @Secured, @PreAuthorize, 등에 @Controller의.

나를 위해 작동하지 않은 것은 컨트롤러 @Validated와 결합되었습니다 @Secured.

@Controller
@Secured("ROLE_ADMIN")
public class AdministrationController {

// @InitBinder here...

@RequestMapping(value = "/administration/add-product", method = RequestMethod.POST)
public String addProductPost(@ModelAttribute("product") @Validated ProductDto product, BindingResult bindingResult) {
    // ...
}

Validator는 단순히 실행되지 않으며 (Spring MVC 4.1.2, Spring Security 3.2.5) 검사가 수행되지 않습니다.

비슷한 문제가 스프링에 의해 사용 CGLIB 프록시에 의해 발생 (클래스에 의해 구현에는 인터페이스가 없을 때, 봄은 CGLIB 프록시를 생성, JDK 프록시 다음 어떤 인터페이스가 생성되는 클래스가 구현하는 경우 - 문서 , 물론 여기에서 설명 하고 여기에 ).

위에서 링크 한 답변에서 언급했듯이 일반적으로 인터페이스를 구현하는 서비스 계층 (JDK 프록시가 사용됨)에서 Spring Security 주석을 사용하는 것이 그러한 문제를 일으키지 않기 때문에 더 좋지 않습니다.

당신이 웹 컨트롤러를 확보하려면 더 나은 아이디어가 사용하는 것입니다 <http>그리고 <intercept-url />그는 꽤 잘 특정 URL이 아닌 컨트롤러의 방법과 작업에 바인딩됩니다. 나의 경우에는:

<http use-expressions="true" disable-url-rewriting="true">

    ...

    <intercept-url pattern="/administration/**" access="hasRole('ROLE_ADMIN')" />

</http>

xml 구성을 변경하여 작동하도록 만드는 방법에 대한 답변이 이미 있습니다. 그러나 코드 기반 구성으로 작업하는 경우 @Configuration클래스 위에 다음 주석을 배치하여 동일한 작업을 수행 할 수 있습니다 .

@EnableGlobalMethodSecurity(prePostEnabled=true)

Andy가 제공 한 답변을 확장하려면 다음을 사용할 수 있습니다.

@PreAuthorize("hasRole('foo')")

특정 역할을 확인합니다.


먼저 @Pre 및 @Post 주석을 활성화하려면 WebSecurityConfig에이 주석을 추가해야합니다.

    @EnableGlobalMethodSecurity(prePostEnabled = true)

You can also check roles/authorities as follows

    @PreAuthorize("hasAuthority('ROLE_ADMIN')")

equivalent to

    @PreAuthorize("hasRole('ROLE_ADMIN')")

You can also check multiple roles/authorities as follows

    @PreAuthorize("hasAuthority('ROLE_ADMIN') or hasAuthority('ROLE_USER') or ...")

참고URL : https://stackoverflow.com/questions/3087548/can-spring-security-use-preauthorize-on-spring-controllers-methods

반응형