【问题标题】:Spring Security authenticationSuccessHandler and j_security_checkSpring Security authenticationSuccessHandler 和 j_security_check
【发布时间】:2014-01-04 18:54:50
【问题描述】:

我遇到了一个对我来说很奇怪的问题,所以也许有人可以提供帮助。 在我的 security.xml 我有这个:

<http auto-config="true">
    <intercept-url pattern="/app/admin/**" access="ROLE_ADMIN"/>
    <intercept-url pattern="/app/**" access="ROLE_ADMIN,ROLE_USER"/>
    <form-login login-page="/login" authentication-failure-url="/login?error=true" login-processing-url="/j_security_check" authentication-success-handler-ref="authSuccessHandler"/>
    <remember-me user-service-ref="userDao" key="e37f4b31-0c45-11dd-bd0b-0800200c9a66" authentication-success-handler-ref="authSuccessHandler"/>
</http>

在我添加之前一切正常:authentication-success-handler-ref="authSuccessHandler",它很简单,如下所示:

        @Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
    logger.info("authenticated");
    User user = userManager.getUserByUsername(request.getRemoteUser());
    Hibernate.initialize(user.getMessagesList());
    request.getSession(true).setAttribute("userMessages", user.getMessagesList());
}

现在一切正常,现在的问题是每次登录或 rememberMe 登录时,无论 URL 是什么,访问的第一个页面总是空白。在正常登录时,出现空白的页面是 /j_security_check 所以似乎由于我的成功处理程序而没有处理某些内容,正如预期的那样,删除处理程序时一切正常。我在这里错过了什么吗?请帮帮我。

【问题讨论】:

    标签: spring authentication spring-security j-security-check


    【解决方案1】:

    通常当您没有显式配置AuthenticationSuccessHandler 时,spring 会为您配置一个SavedRequestAwareAuthenticationSuccessHandler 来处理成功案例。它的作用是在身份验证成功后将用户发送到最初请求的 URL(或者在指定并强制到配置中指定的默认页面时)。

    您的自定义实现没有做任何事情,它只是在会话上设置一些内容并完成,它不会将任何内容发送回客户端。您可能想要的是扩展SavedRequestAwareAuthenticationSuccessHandler 做您的事情,然后调用super.onAuthenticationSuccess

    【讨论】:

    • 非常感谢,这正是问题所在。我确实必须切换到:SecurityContextHolder.getContext().getAuthentication().getName() 而不是 request.getRemoteUser() 因为这不适用于 j_security_check 登录,但现在一切正常!
    • 只有在SecurityContextHolderAwareRequestFilter 完成它的工作后,spring 安全集成才起作用。此过滤器在处理表单登录的过滤器之后执行。所以确实request.getRemoteUser() 还不行。
    猜你喜欢
    • 2019-11-02
    • 2016-07-17
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 2011-09-19
    • 2017-05-12
    • 2016-06-07
    • 2019-06-24
    相关资源
    最近更新 更多