1

我正在使用 Spring security 拦截器来错误记录用户,但我找不到解决方法。

我特别想保存最后登录的用户,但我不知道如何实现这一点。

请帮帮我

4

1 回答 1

3

是的,你可以这么做。您可以在配置 xml 文件中的标记中定义以下标记。

<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 回答