사용자 정의 필터에서 Java 구성을 사용하여 AuthenticationManager를 삽입하는 방법


81

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
@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
    }
}

이것이 사용자 지정 필터 클래스입니다. 나에게 문제를주는 줄은 AuthenticationManager의 setter입니다.

@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);
    }
}

Autowired가 재정의 바로 위에 무엇을하는지 물어봐도 될까요? 나는 이것을 본 적이 없다. 이것에 무엇이 연결되어 있습니까?
Stephane 2014

사용자 정의 필터를 어떻게 추가 했습니까? 나만의 필터와 인증 공급자를 만들었습니다. 하지만 함께 작동하도록 구성하는 방법을 모르겠습니다. 여기 내 질문이 있습니다. stackoverflow.com/questions/30502589/…
PaintedRed

답변:


187

Spring Bean으로 사용하여 빌드 된 AuthenticationManager를 노출하기 위해 메소드 authenticationManagerBean를 대체하십시오 .WebSecurityConfigurerAdapterconfigure(AuthenticationManagerBuilder)

예를 들면 :

   @Bean(name = BeanIds.AUTHENTICATION_MANAGER)
   @Override
   public AuthenticationManager authenticationManagerBean() throws Exception {
       return super.authenticationManagerBean();
   }

1
@qxixp "configure (AuthenticationManagerBuilder)를 사용하여 빌드 된 AuthenticationManager를 Spring Bean으로 노출하기 위해"
Roger

1
@Roger, 왜 AuthenticationManager를 수동으로 노출해야합니까?
qxixp 2015 년

11
@qxixp는 스프링 관리 빈만 Autowire 할 수 있습니다. 빈으로 노출되지 않으면 Autowire 할 수 없습니다.
Roger

수퍼 메소드는 Bean이 아니므로이를 대체하고 Bean 어노테이션을 추가하십시오.
검색

2
이 답변에 실제로 도움이 된 것은 "name = BeanIds.AUTHENTICATION_MANAGER"입니다. 그것 없이는 적어도 내 환경에서 작동하지 않습니다.
Isthar 2017

1

Angular University가 위에서 말한 것 외에도 @Import 를 사용 하여 @Configuration 클래스를 다른 클래스 (내 경우에는 AuthenticationController)로 집계 할 수 있습니다 .

@Import(SecurityConfig.class)
@RestController
public class AuthenticationController {
@Autowired
private AuthenticationManager authenticationManager;
//some logic
}

@Import로 @Configuration 클래스 집계에 대한 Spring 문서 : 링크

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.