2016-11-30 11 views
0

カスタムフィルタとfailureHandlerを作成しました。しかし、私はフィルタにハンドラを登録する必要がありますそれを働かせる。誰かが私のコードでそれを行う方法を書くなら、私は喜んでいます。私はstackowerflowで多くの例があることを知っていますが、私は春とJavaに新しいし、それがどのように動作するか理解するために私は私のアプリケーションの例が必要です。 「これは重複しています」と答えないでください。 マイフィルタ:カスタムフィルタスプリングセキュリティでカスタムFailureHandlerを登録する方法

@Component("MyAuthFilter") 
public class MyAuthFilter extends UsernamePasswordAuthenticationFilter { 

    private int errCode = 5; 

    @Autowired 
    @Qualifier("authenticationManager") 
    @Override 
    public void setAuthenticationManager(AuthenticationManager authenticationManager) { 
     super.setAuthenticationManager(authenticationManager); 
    } 

    @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); 
     System.out.println(login + " - " + password); 
     System.out.println(request.getQueryString());   
     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; 
    } 
} 

ここでは私のハンドラである:

public class LoginFailureHandler extends SimpleUrlAuthenticationFailureHandler { 

    public LoginFailureHandler() { 
     System.out.println("i debug"); 
    } 

    @Override 
    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, 
      AuthenticationException exception) throws IOException, ServletException { 

      System.out.println("do smth"); 
      super.onAuthenticationFailure(request, response, exception); 

    } 

} 

と私の春-のsecurity.xml:

<beans:bean id="authenticationFailureHandler" class="com.webproject.LoginFailureHandler" /> 

    <http auto-config="true" 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" 
      username-parameter="loginField" 
      password-parameter="passwordField" 
      authentication-failure-handler-ref="authenticationFailureHandler" 
     /> 
     <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> 

答えて

1

は豆に宣言し、あなたのフィルタ

にそれらをautowire
@Bean 
public AuthenticationFailureHandler getFailureHandler(){ 
    SimpleUrlAuthenticationFailureHandler handler = new SimpleUrlAuthenticationFailureHandler(); 
    handler.setDefaultFailureUrl("/login.html"); 
    return handler; 
} 

MyAutコンフィギュレーション・クラスのhFilter

@Autowired 
@Qualifier("authenticationManager") 
@Override 
public void setAuthenticationManager(AuthenticationManager authenticationManager, AuthenticationFailureHandler failureHandler) { 
    this.setAuthenticationManager(authenticationManager); 
    this.setAuthenticationFailureHandler(failureHandler); 
} 
+0

、または私はxmlファイルを使用し@Component – kuhajeyan

+0

であなたのハンドラを単にマーク可能性があり、私はすでにそれが好きで宣言した: '<豆:豆ID =「authenticationFailureHandler」クラス=」 com.webproject.LoginFailureHandler "/> – Papich

+0

これは – kuhajeyan

関連する問題