我将Wicket与 Wicket Auth Project 一起用于我的表示层,因此我将它与 Spring Security 集成。这是 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 节。参考文档的会话固定攻击保护说:
会话固定攻击是一种潜在风险,恶意攻击者可能通过访问站点来创建会话,然后说服另一个用户使用相同的会话登录(通过向他们发送包含会话标识符作为参数的链接,例如例子)。Spring Security 通过在用户登录时创建一个新会话来自动防止这种情况发生。如果您不需要此保护,或者它与其他一些要求冲突,您可以使用 session-fixation-protection 属性控制该行为有三个选项:
- migrateSession - 创建一个新会话并将现有会话属性复制到新会话。这是默认设置。
- none - 不做任何事情。原始会话将被保留。
- newSession - 创建一个新的“干净”会话,而不复制现有会话数据。
身份验证有效,但由于我对 Spring Security 还很陌生,所以我也有一些问题需要回答:
- 通常对于登录,我会将身份验证信息发布到
j_spring_security_check
并让 Spring Security 执行实际的身份验证代码。我想要保护免受会话固定攻击,当我像我一样执行程序登录时会得到它吗?如果没有,我该怎么做才能得到它? - 如何执行程序化注销?
- 由于我将使用编程登录和注销,我如何禁用 Spring 拦截这些 URL?
更新:
对于会话固定攻击保护,似乎我需要使用签名调用 SessionUtils 类中的方法startNewSessionIfRequired(HttpServletRequest request, boolean migrateAttributes, SessionRegistry sessionRegistry)
。
如何获取需要传入的 SessionRegistry 实例?我找不到任何方法为其创建别名 ID,或者如何获取它的 ID 或名称。