Yes, it works fine.
You need in . It also requires CGLIB proxies, so either your controllers shouldn't have interfaces, or you should use
.<security:global-method-security pre-post-annotations="enabled" />...-servlet.xmlproxy-target-class = true
//
Generally we would recommend applying method security at the service layer rather than on individual web controllers.
@PreAuthorize/@PostAuthorize를 @Controller에서 사용하는 것에 대해.
: Controller단에서 사용하는 것은 권장하지 않으나 servlet-context에서 설정함으로서 가능하긴함.
Error) AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext
: login URL에 접근해 로그인할 때 존재하지 않는계정, 비밀번호 오류, 계정 잠김 등의 에러 발생 시 CustomLoginFailureHandler를 타고 정상 동작하던 것이 어느날 갑자기 위와 같은 에러를 발생시켰다.
-> login URL가 Mapping된 메서드에 지정한 @PreAuthorize를 지우고
security-context에서 intercept-url 태그를 이용하니 에러 해결됨.
@RequestMapping(value = "/login", method = {RequestMethod.GET ,RequestMethod.POST})
// @PreAuthorize("isAnonymous()")
public String Login(HttpServletRequest request, HttpServletResponse response,
@RequestParam(value = "error", required = false) boolean error) {
<security:http auto-config="true" use-expressions="true" >
...
<security:intercept-url pattern="/login" access="isAnonymous()"/>
...
</security:http>
=> 결론. @Controller에서 어노테이션을 이용해 권한 부여를 하는 것은 간편하고 직관적이지만 적절하진 않은 것 같다. login과 같이 Spring Security와 충돌이 염려되는 URL에 대해서는 security-context에서 권한 부여하는 것으로 하자.