我正在使用 Wicket 作为我的演示层,并且已经将其与 Spring 安全性整合。这是由 Wicket 调用的用于我的身份验证的方法:
@Override
public boolean authenticate(String username, String password) {
try {
Authentication request = new UsernamePasswordAuthenticationToken(
username, password);
Authentication result = authenticationManager.authenticate(request);
SecurityContextHolder.getContext().setAuthentication(result);
} catch (AuthenticationException e) {
return false;
}
return true;
}
我的Spring Security XML配置文件中的内容如下:
<http path-type="regex">
<form-login login-page="/signin"/>
<logout logout-url="/logout" />
</http>
<global-method-security secured-annotations="enabled" />
<authentication-manager alias="authenticationManager"/>
<authentication-provider user-service-ref="userService">
<password-encoder ref="bcryptpasswordencoder" />
</authentication-provider>
参考文档的2.3.6章节Session Fixation Attack Protection表示:
会话固定攻击是一种潜在的风险,恶意攻击者通过访问站点创建一个会话,然后诱使另一个用户使用相同的会话登录(例如,发送一个包含会话标识符作为参数的链接)。Spring Security通过在用户登录时创建新会话来自动防护。如果不需要此保护或它与其他要求冲突,可以使用session-fixation-protection属性控制行为,该属性有三个选项:
- migrateSession - 创建一个新会话并将现有会话属性复制到新会话中。这是默认设置。
- none - 什么也不做。原始会话将被保留。
- newSession - 创建一个新的“干净”会话,不复制现有会话数据。
身份验证有效,但由于我对Spring Security还很新,因此有些问题需要回答:
- 通常为了登录,我会将身份验证信息POST到
j_spring_security_check
,让Spring Security执行实际的身份验证代码。我想要防止会话固定攻击,那么像我这样执行编程式登录,会得到此保护吗?如果没有,我需要做什么才能得到它? - 如何执行编程式注销?
- 由于我将使用编程式登录和注销,那么如何禁用Spring拦截这些URL?
更新:对于会话固定攻击保护,似乎我需要调用SessionUtils类中的方法,其签名为startNewSessionIfRequired(HttpServletRequest request, boolean migrateAttributes, SessionRegistry sessionRegistry)
。
我该如何获取所需的SessionRegistry实例并将其传递给该方法?我找不到任何方法来为其创建别名ID,或如何获取其ID或名称。