1

インターセプターから間違ってログに記録されたユーザーへのSpringセキュリティを使用していますが、その方法が見つかりません。

特に最後にログインしたユーザーを保存したいのですが、これを達成する方法がわかりません。

助けてください

4

1 に答える 1

3

はい、できます。構成 xml ファイルの tag に次のタグを定義できます。

<security:form-login login-page="/sessionexpired" 
login-processing-url="/j_spring_security_check" 
default-target-url="/submitLogin" 
always-use-default-target="true" 
authentication-failure-handler-ref="customAuthenticationFailureHandler"/>

最後のパラメーター セットauthentication-failure-handler-refを確認できます。その値は、同じ xml ファイルで定義されている次の Bean への参照です。

<bean id="customAuthenticationFailureHandler" class="com.xxx.xxx.xxx.CustomFilter">
        <constructor-arg type="String" value="loginfailed"></constructor-arg>
        <constructor-arg type="org.hibernate.SessionFactory" ref="sessionFactory"></constructor-arg>        
</bean>

この Bean で定義されたクラスは、失敗したログインの詳細に関する情報を取得する独自のクラスです。

public class CustomFilter extends SimpleUrlAuthenticationFailureHandler {

    private String defaultFailureUrl;      
    private SessionFactory sessionFactory;


    public CustomFilter(String defaultFailureUrl,SessionFactory sessionFactory) {
        super();
        this.defaultFailureUrl = defaultFailureUrl;
        this.sessionFactory = sessionFactory;
    }

    @Override
    public void onAuthenticationFailure(HttpServletRequest request,
            HttpServletResponse response, AuthenticationException exception)
            throws IOException, ServletException {
        // TODO Auto-generated method stub

        String userName = request.getParameter("j_username");;
        /*System.out.println("CustomFilter Begins");        
        System.out.println("CustomeFilter.username :: " + userName);
        System.out.println("getMessage :: " + exception.getMessage());
        System.out.println("exception :: " + exception.getClass().getSimpleName());
        System.out.println("RemoteAddr :: " + request.getRemoteAddr());        */
    }
}

認証が失敗するとonAuthenticationFailure、このクラスのメソッドが呼び出され、そこでユーザーの詳細を取得して、データベースまたはログ ファイルにログインできます。

これがお役に立てば幸いです。乾杯。

于 2012-09-15T07:24:01.553 に答える