[SPRING] AuthenticationCredentialsNotFoundException : 보안 컨텍스트에서 인증 개체를 찾을 수 없습니다.
SPRINGAuthenticationCredentialsNotFoundException : 보안 컨텍스트에서 인증 개체를 찾을 수 없습니다.
크롬 브라우저의 POSTMAN 플러그인에서 JSON 페이로드를 REST URL (http : // localhost : 8080 / services / acc / create)로 표시된 컨트롤러로 보내려고 할 때 아래 오류가 발생합니다.
SEVERE: Servlet.service() for servlet [dispatcher] in context with path [/services] threw exception [Request processing failed; nested exception is org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext] with root cause
org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext
at org.springframework.security.access.intercept.AbstractSecurityInterceptor.credentialsNotFound(AbstractSecurityInterceptor.java:339)
at org.springframework.security.access.intercept.AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:198)
at org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor.invoke(MethodSecurityInterceptor.java:60)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655)
at com.webadvisors.controller.HotelRestController$$EnhancerBySpringCGLIB$$e9f80d9.createHotel(<generated>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:114)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
JSON 페이로드를 POSTMAN의 REST URL로 보내는 동안 권한 유형으로 BasicAuth를 선택하고 사용자 이름과 암호를 입력했습니다.
1) 컨트롤러 클래스
@RestController
public class AccountRestController {
@Autowired
private AccountService accountService;
@PreAuthorize("hasAnyRole('ADMINISTRATOR')")
@RequestMapping(value= "/acc/create", method=RequestMethod.POST)
public HotelDTO createHotel(@RequestBody AccountDTO accDTO) throws Exception{
return accountService.create(accDTO);
}
}
2) 보안 구성 클래스
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
@EnableWebSecurity
@ComponentScan(basePackages = "com.freelance", scopedProxy = ScopedProxyMode.INTERFACES)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
@Qualifier("authenticationService")
private UserDetailsService userDetailsService;
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService);
auth.authenticationProvider(authenticationProvider());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/user/**").permitAll()
.anyRequest().fullyAuthenticated();
http.httpBasic();
http.csrf().disable();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public DaoAuthenticationProvider authenticationProvider() {
DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
authenticationProvider.setUserDetailsService(userDetailsService);
authenticationProvider.setPasswordEncoder(passwordEncoder());
return authenticationProvider;
}
}
3) 스프링 보안 의존성
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>3.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>3.2.3.RELEASE</version>
</dependency>
나는 POSTMAN에 인증 증명서를 보내고 있습니다. 하지만 여전히 위의 예외가 발생하는 이유는 무엇입니까?
해결법
-
==============================
1.WebSecurityConfigurerAdapter를 사용하여 springSecurityFilterChain을 만들었습니다. Spring Security Reference :
WebSecurityConfigurerAdapter를 사용하여 springSecurityFilterChain을 만들었습니다. Spring Security Reference :
하지만 당신은 그것을 사용하지 않았다 (당신의 스택 트레이스에는 없다).
springSecurityFilterChain을 등록해야합니다. Servlet 3.0+ 환경을 가지고 있다면, Spring Security Reference :
from https://stackoverflow.com/questions/41710743/authenticationcredentialsnotfoundexception-an-authentication-object-was-not-fou by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring / Hibernate / JPA에서 PostgreSQL 함수 (저장 프로 시저)를 올바르게 호출하는 방법? (0) | 2019.04.23 |
---|---|
[SPRING] 유니 코드 문자와 스프링 JavaMailSenderImpl, 리눅스에서 유니 코드 문자가 없습니다! (0) | 2019.04.23 |
[SPRING] Spring @ Servlet에 게시 됨 (0) | 2019.04.23 |
[SPRING] 봄 부팅 1.5.2 - 로고를로드 한 후 웹 응용 프로그램이 멈 춥니 다? (0) | 2019.04.23 |
[SPRING] 스프링 보안이 작동하지 않는 이유는 무엇입니까? (0) | 2019.04.23 |