कस्टम फ़िल्टर में जावा कॉन्फ़िगरेशन का उपयोग करके प्रमाणीकरण प्रबंधक को कैसे इंजेक्ट करें


81

मैं स्प्रिंग सिक्योरिटी 3.2 और स्प्रिंग 4.0.1 का उपयोग कर रहा हूं

मैं एक xml config को जावा कॉन्फिगर में बदलने पर काम कर रहा हूं। जब मैं अपने फ़िल्टर में एनोटेट 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>

यहाँ जावा विन्यास मैं प्रयास कर रहा हूँ

@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 class है। मुझे परेशानी देने वाली रेखा ऑथेंटिकेशन मैनजर का सेटर है

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

क्या मैं पूछ सकता हूं कि ऑटोराइड एक ओवरराइड के ठीक ऊपर क्या है? मैंने पहले इसे कभी नहीं देखा है। इसके साथ क्या वायर्ड है?
स्टीफन

आपने अपना कस्टम फ़िल्टर कैसे जोड़ा? मैंने अपना स्वयं का फ़िल्टर और प्रमाणीकरण प्रदाता बनाया। लेकिन मुझे नहीं पता कि उन्हें एक साथ काम करने के लिए कैसे कॉन्फ़िगर किया जाए। यहाँ मेरा सवाल है stackoverflow.com/questions/30502589/…
PaintedRed

जवाबों:


190

विधि ओवरराइड authenticationManagerBeanमें WebSecurityConfigurerAdapterबेनकाब करने के लिए AuthenticationManager का उपयोग कर बनाया configure(AuthenticationManagerBuilder)एक वसंत सेम के रूप में:

उदाहरण के लिए:

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

1
@qxixp "स्प्रिंग बीन के रूप में कॉन्फ़िगर (AuthenticationManagerBuilder) का उपयोग करके निर्मित AuthenticationManager को उजागर करने के लिए"
रोजर

1
@Roger, हमें AuthenticationManager को मैन्युअल रूप से उजागर करने की आवश्यकता क्यों है?
क्विक्सिक्स

11
@qxixp आप केवल एक स्प्रिंग प्रबंधित बीन को स्वायत्त कर सकते हैं। यदि इसकी सेम के रूप में उजागर नहीं किया जाता है, तो आप इसे स्वायत्त नहीं कर सकते।
रोजर

सुपर विधि एक बीन नहीं है, फिर इसे ओवरराइड करें और बीन एनोटेशन जोड़ें।
searching9x

2
इस जवाब से मुझे वास्तव में जो मदद मिली, वह है "नाम = बीनइंड्स। AUTHENTICATION_MANAGER"। इसके बिना, यह मेरे वातावरण में कम से कम काम नहीं करता है।
इस्थर

1

कोणीय विश्वविद्यालय ने जो कहा उसके अलावा आप @Import को अन्य वर्गों के लिए @Configuration क्लासेस को एग्रीगेट करना चाहेंगे (मेरे मामले में AuthenticationController):

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

स्प्रिंग डॉक एग्रीगेटिंग के बारे में @ कॉनफिगरेशन क्लासेस @Import: लिंक के साथ

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.