2016-11-29 65 views
0
@Component("MyAuthFilter") 
     public class MyAuthFilter extends UsernamePasswordAuthenticationFilter { 

    private int errCode = 0; 

    @Autowired 
    @Qualifier("authenticationManager") 
    //@Override 
    public void setAuthenticationManager(AuthenticationManager authenticationManager, AuthenticationSuccessHandler successHandler, AuthenticationFailureHandler failureHandler) { 
     super.setAuthenticationManager(authenticationManager); 
     this.setAuthenticationSuccessHandler(successHandler); 
     this.setAuthenticationFailureHandler(failureHandler); 
    } 

    @Override 
    public AuthenticationFailureHandler getFailureHandler() { 
     SimpleUrlAuthenticationFailureHandler handler = new SimpleUrlAuthenticationFailureHandler(); 
     handler.setDefaultFailureUrl("/login?error=" + errCode); 
     return handler; 
    } 

    @Override 
    public AuthenticationSuccessHandler getSuccessHandler() { 
     SavedRequestAwareAuthenticationSuccessHandler handler = new SavedRequestAwareAuthenticationSuccessHandler(); 
     handler.setDefaultTargetUrl("/courses"); 
     return handler; 
    } 

    @Override 
    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) 
      throws AuthenticationException { 

     System.out.println("running my own version of UsernmePasswordFilter ... "); 

     String login = (String) request.getParameter("login"); 
     String password = (String) request.getParameter("password"); 
     errCode = validate(login,password);  
     UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(login, password); 
     // Allow subclasses to set the "details" property 
     setDetails(request, authRequest); 

     return this.getAuthenticationManager().authenticate(authRequest); 
    } 

    private int validate(String login,String password){ 

     if (login.isEmpty() && password.isEmpty()){ 
      return 4; 
     } 
     if (login.isEmpty() && !password.isEmpty()){ 
      return 2; 
     } 
      if (!login.isEmpty() && password.isEmpty()){ 
      return 3; 
     } 

     return 1; 
    } 
} 

这是MyAuthFilter。弹簧安全性没有合格的bean类型AuthenticationSuccessHandler和AuthenticationFalureHandler

,在这里我的弹簧security.xml文件

<beans:beans xmlns="http://www.springframework.org/schema/security" 
      xmlns:beans="http://www.springframework.org/schema/beans" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-4.2.xsd 
    http://www.springframework.org/schema/security 
    http://www.springframework.org/schema/security/spring-security-4.2.xsd"> 

    <http auto-config="false" use-expressions="true"> 
     <intercept-url pattern="/courses*" access="hasRole('ROLE_USER')" /> 
     <custom-filter before="FORM_LOGIN_FILTER" ref="MyAuthFilter" /> 
     <form-login 
      login-page="/login" 
      default-target-url="/courses" 
      authentication-failure-url="/login" 
      username-parameter="loginField" 
      password-parameter="passwordField" /> 
     <csrf disabled="true" /> 
    </http> 

    <authentication-manager alias="authenticationManager"> 
     <authentication-provider> 
      <user-service> 
       <user name="ars" password="1234" authorities="ROLE_USER" /> 
      </user-service> 
     </authentication-provider> 
    </authentication-manager> 

</beans:beans> 

当我尝试启动我的应用程序,我得到一个例外

型AuthenticationSuccessHandler

和同样的错误的不符合条件的豆为FailureHandler 。我将不胜感激任何帮助。

+0

尝试增加'@ EnableWebSecurity'您的安全配置。基于上下文,我不认为你使用的是Spring Boot,通常这会自动处理。 –

回答

1

您的AuthenticationSuccessHandler未声明为bean。 你应该将其创建为bean并通过属性在标签的弹簧security.xml文件登记 认证成功处理程序-REF =“nameOfYouSuccessHandlerBean”

所以这将是这样的:在 配置java文件,其中的一些:

@Bean 
    public AuthenticationSuccessHandler mySuccessHandler() { 
     SavedRequestAwareAuthenticationSuccessHandler handler = new SavedRequestAwareAuthenticationSuccessHandler(); 
     handler.setDefaultTargetUrl("/courses"); 
     return handler; 
    } 

和弹簧security.xml文件

<form-login 
      login-page="/login" 
      default-target-url="/courses" 
      authentication-failure-url="/login" 
      username-parameter="loginField" 
      authentication-success-handler-ref="mySuccessHandler"    
      password-parameter="passwordField" /> 
+0

我该如何配置mySuccessHandler与XML而不是配置Java文件? – Papich

+0

当然, <豆ID = “org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler” 类= “net.test.employee.dao.EmployeeDAOImpl”> <属性名= “defaultTargedUrl” 值=“/课程“/> in your spring.xml – Sobik