1

我对AuthenticationProvider这种authenticate方法有一个习惯。

    @Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {

        > Check username, password, throw exceptions where needed

        return new CustomAuthenticationToken(username, grantedAuthorities);
    }

和令牌:

public class CustomAuthenticationToken extends UsernamePasswordAuthenticationToken
{
     public CustomAuthenticationToken(ICurrentUserContext currentUser, List<GrantedAuthority> authorities) {
         super(currentUser.getUsername(), currentUser.getPassword(), authorities);
     }
}

当我使用 Chrome、Firefox 登录时,没有任何问题。

在 IE 8/9 中,我遇到了一个非常奇怪的问题。有时它只会调用authenticate一次该方法,它会登录并且一切都按预期工作。但时不时会调用authenticate两次,登录失败。

有人有任何线索吗?

顺便说一句,我已经在 Tomcat 上对其进行了测试。

4

4 回答 4

2

我发现了问题,仔细跟踪了 Spring Security 的调试日志。希望这对将来的人有所帮助。

显然,spring security 默认会在登录后迁移会话。但在 IE 中,它不会将身份验证 cookie 迁移到新会话,从而导致出现登录页面。

修复很简单,可以在 Spring Security xml 中完成:

<http use-expressions="true">

    <!-- 
        This settings is for IE. Default this setting is on migrateSession.
        When IE tries to migrate the session, the auth cookie does not migrate,
        resulting in a nice login screen again, after you've logged in.

        This setting ensures that the session will not be invalidated, and thus IE will still work as expected.
     -->
    <session-management session-fixation-protection="none" />
</http>
于 2012-11-29T12:09:44.693 回答
1

迁移会话完全是一个服务器端过程,浏览器应该不可见。它应该看到的只是Set-CookieJSESSIONID 的新标头,它应该尊重它。

我最好的猜测是您看到了这个 tomcat 错误,它会根据浏览器解释重复标头的方式产生不同的效果。最初报告它是因为与您在此处看到的内容密切相关的黑莓浏览器存在此问题。

但是你没有说你正在使用哪个版本的 Spring Security 或 Tomcat(总是一个好主意:-)),所以很难确定。

于 2012-11-29T13:55:29.220 回答
1

访问自定义 weblogic 提供程序时,请查看Internet Explorer 错误

也许你可以在你的 Tomcat 上禁用 cookie

于 2012-11-29T10:51:50.287 回答
0

目录 快速参考 Spring Security 核心插件 << 17IP 地址限制 19Logout Handlers >> 18 Session Fixation Prevention - 参考文档 作者:Burt Beckwith, Beverley Talbott 版本:2.0-RC3 18 Session Fixation Prevention 为防止 session-fixation 攻击设置 useSessionFixationPrevention属性为 true: grails.plugin.springsecurity.useSessionFixationPrevention = true 成功认证后,将创建一个新的 HTTP 会话,并将前一个会话的属性复制到其中。如果您通过单击由试图破解您帐户的人生成的链接开始您的会话,该链接包含一个活动会话 ID,那么您在登录后将不再共享上一个会话。你有你自己的会话。

由于 Grails 默认情况下 URL 中不包含 jsessionid(请参阅此 JIRA 问题),因此会话固定不再是一个问题,但使用此功能仍然是一个好主意。

请注意,使用 cookie-session 插件时会出现问题;有关更多详细信息,请参阅此问题。

该表显示了会话固定的配置选项。

属性 默认值 含义 useSessionFixationPrevention true 是否使用会话固定预防。sessionFixationPrevention.migrate true 登录后是否将现有会话的会话属性复制到新会话中。sessionFixationPrevention.alwaysCreateSession false 是否始终创建会话,即使在请求开始时不存在会话。

http://grails-plugins.github.io/grails-spring-security-core/guide/sessionFixation.html

于 2014-07-07T14:07:47.717 回答