커스텀 필터에 Java Configuration을 사용하여 Authentication Manager를 삽입하는 방법
Spring Security 3.2 및 Spring 4.0.1을 사용하고 있습니다.
xml 설정을 Java 설정으로 변환하는 작업을 하고 있습니다.주석을 달 때AuthenticationManager
와 함께@Autowired
내 필터에서 예외가 발생하고 있습니다.
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.security.authentication.AuthenticationManager] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
주사도 해봤는데AuthenticationManagerFactoryBean
하지만 그것도 비슷한 예외를 제외하고는 실패합니다.
작업하고 있는 XML 설정은 다음과 같습니다.
<?xml version="1.0" encoding="UTF-8"?> <beans ...>
<security:authentication-manager id="authenticationManager">
<security:authentication-provider user-service-ref="userDao">
<security:password-encoder ref="passwordEncoder"/>
</security:authentication-provider>
</security:authentication-manager>
<security:http
realm="Protected API"
use-expressions="true"
auto-config="false"
create-session="stateless"
entry-point-ref="unauthorizedEntryPoint"
authentication-manager-ref="authenticationManager">
<security:access-denied-handler ref="accessDeniedHandler"/>
<security:custom-filter ref="tokenAuthenticationProcessingFilter" position="FORM_LOGIN_FILTER"/>
<security:custom-filter ref="tokenFilter" position="REMEMBER_ME_FILTER"/>
<security:intercept-url method="GET" pattern="/rest/news/**" access="hasRole('user')"/>
<security:intercept-url method="PUT" pattern="/rest/news/**" access="hasRole('admin')"/>
<security:intercept-url method="POST" pattern="/rest/news/**" access="hasRole('admin')"/>
<security:intercept-url method="DELETE" pattern="/rest/news/**" access="hasRole('admin')"/>
</security:http>
<bean class="com.unsubcentral.security.TokenAuthenticationProcessingFilter"
id="tokenAuthenticationProcessingFilter">
<constructor-arg value="/rest/user/authenticate"/>
<property name="authenticationManager" ref="authenticationManager"/>
<property name="authenticationSuccessHandler" ref="authenticationSuccessHandler"/>
<property name="authenticationFailureHandler" ref="authenticationFailureHandler"/>
</bean>
</beans>
이것이 제가 시도하고 있는 Java Configuration입니다.
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Autowired
private PasswordEncoder passwordEncoder;
@Autowired
private AuthenticationEntryPoint authenticationEntryPoint;
@Autowired
private AccessDeniedHandler accessDeniedHandler;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.exceptionHandling()
.authenticationEntryPoint(authenticationEntryPoint)
.accessDeniedHandler(accessDeniedHandler)
.and();
//TODO: Custom Filters
}
}
이것은 Custom Filter 클래스입니다.트러블을 일으키고 있는 회선은 Authentication Manager의 세터입니다.
@Component
public class TokenAuthenticationProcessingFilter extends AbstractAuthenticationProcessingFilter {
@Autowired
public TokenAuthenticationProcessingFilter(@Value("/rest/useAuthenticationManagerr/authenticate") String defaultFilterProcessesUrl) {
super(defaultFilterProcessesUrl);
}
@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException, IOException, ServletException {
...
}
private String obtainPassword(HttpServletRequest request) {
return request.getParameter("password");
}
private String obtainUsername(HttpServletRequest request) {
return request.getParameter("username");
}
@Autowired
@Override
public void setAuthenticationManager(AuthenticationManager authenticationManager) {
super.setAuthenticationManager(authenticationManager);
}
@Autowired
@Override
public void setAuthenticationSuccessHandler(AuthenticationSuccessHandler successHandler) {
super.setAuthenticationSuccessHandler(successHandler);
}
@Autowired
@Override
public void setAuthenticationFailureHandler(AuthenticationFailureHandler failureHandler) {
super.setAuthenticationFailureHandler(failureHandler);
}
}
덮어쓰기 방식authenticationManagerBean
에WebSecurityConfigurerAdapter
를 사용하여 작성된 Authentication Manager 를 표시합니다.configure(AuthenticationManagerBuilder)
봄콩으로:
예를 들어 다음과 같습니다.
@Bean(name = BeanIds.AUTHENTICATION_MANAGER)
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
Angular University가 전술한 내용과 더불어 @Import를 사용하여 @Configuration 클래스를 다른 클래스로 집약할 수 있습니다(이 경우는 AuthenticationController).
@Import(SecurityConfig.class)
@RestController
public class AuthenticationController {
@Autowired
private AuthenticationManager authenticationManager;
//some logic
}
@Import: 링크를 사용하여 @Configuration 클래스를 집약하는 방법에 대한 Spring 문서
@Bean'ed AuthenticationManager와 @Autowired를 같은 클래스에서 사용할 때는 순환 참조를 활성화해야 하지만 CDI에 대해서는 그렇지 않습니다.
언급URL : https://stackoverflow.com/questions/21633555/how-to-inject-authenticationmanager-using-java-configuration-in-a-custom-filter
'programing' 카테고리의 다른 글
WP의 특정 페이지에 대한 "현재 메뉴 항목" 클래스 사용자 지정 설정 (0) | 2023.03.07 |
---|---|
GET 요청을 통해 Angular를 사용하여 어레이 전송JS의 $http 서비스 (0) | 2023.03.07 |
워드프레스 nginx 리다이렉트루프 (0) | 2023.03.07 |
mongo 콘솔에서 오브젝트 ID를 사용하여 오브젝트를 검색하려면 어떻게 해야 합니까? (0) | 2023.03.07 |
WordPress - PHP 경고 스트림을 열지 못했습니다.해당 파일 또는 디렉토리(advanced-cache.php)가 없습니다. (0) | 2023.03.07 |