Error) AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext

이지우·2022년 11월 4일
0

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

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에서 권한 부여하는 것으로 하자.

profile
IT개발 입문합니다.

0개의 댓글