Spring Security的编程使用

2022-09-01 03:58:52

我正在将Wicket与Wicket Auth项目一起使用作为我的表示层,因此我已将其与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通过在用户登录时创建一个新会话来自动防止这种情况。如果您不需要此保护,或者它与某些其他要求冲突,则可以使用 上的会话-固定-保护属性来控制行为,该属性有三个选项:

  • migrateSession - 创建新会话并将现有会话属性复制到新会话。这是默认设置。
  • 无 - 不执行任何操作。原始会话将被保留。
  • new会话 - 创建新的“干净”会话,而不复制现有会话数据。

身份验证有效,但是由于我对Spring Security相当陌生,因此我也有一些问题需要回答:

  • 通常,对于登录,我会将身份验证信息POST到并让Spring Security执行实际的身份验证代码。我希望获得针对会话固定攻击的保护,当我像执行编程登录一样时,我会得到它吗?如果没有,我该怎么做才能得到它?j_spring_security_check
  • 如何执行编程注销?
  • 由于我将使用编程登录和注销,因此如何禁止Spring拦截这些URL?

更新:对于会话固定攻击保护,似乎我需要调用 SessionUtils 类中具有签名的方法。startNewSessionIfRequired(HttpServletRequest request, boolean migrateAttributes, SessionRegistry sessionRegistry)

如何获取需要传入的会话注册表实例?我找不到任何方法来为其创建别名ID,也找不到如何获取其ID或名称的方法。


答案 1

也许这不是你问题的完整答案,但也许它可能会帮助你。

不使用编程登录时调用的代码,但可以在此处找到标准代码:

org.springframework.security.ui.webapp.AuthenticationProcessingFilter

我猜你在你的代码中受到了这个启发。它看起来非常相似。

同样,当您访问 in 标准方法时执行的代码可在此处找到:/j_spring_security_logout

org.springframework.security.ui.logout.LogoutFilter

注销筛选器调用多个处理程序。我们使用的处理程序称为:,因此您可以在方法中调用相同的代码。org.springframework.security.ui.logout.SecurityContextLogoutHandler


答案 2

您确实会对会话固定攻击持开放态度。为了解决这个问题,你可以再次受到Spring代码的“启发”。要创建一个新会话,您显然需要访问 httpsession,因此您可能需要进行一些重构。

如果您看到 SessionUtils.. 方法。startNewSessionIfRequired

这会将身份验证迁移到新会话。您可以直接调用此方法,或者只是稍微重构一下代码。

至于编程注销,你不能走得太远,当你需要注销这个人时,只需打电话。从一般安全角度来看,这将执行所有必要的操作,但请记住,尽管您可能需要清理会话中的一些内容。如果您有一组非常复杂的过滤器等,并且您需要确保用户在请求的其余部分注销,那么您可以添加:session.invalidate()

SecurityContextHolder.getContext().setAuthentication(null);

至于拦截网址,你可以把它们设置为未使用的东西,然后忽略它!我不确定您是否可以在配置中关闭拦截 - 如果您真的想删除它,请查看 - 您可以自定义它。如果这样做,则必须手动设置spring安全xml,并且不使用提供的命名空间。不过这并不难 - 看看一些较旧的文档,你会看到如何做到这一点。AuthenticationProcessingFilter

希望这有帮助!


推荐