gpt4 book ai didi

java - 如何从 Spring Security 中的 session 管理(超时/并发检查)中排除某些页面?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:22:17 26 4
gpt4 key购买 nike

我在 spring-security.xml 中添加了这段代码以启用 session 超时检查和并发检查。

<sec:http>
<sec:form-login login-page="/login" login-processing-url="/authentication"
default-target-url="/home" always-use-default-target="true"
authentication-failure-url="/login?error=true"
username-parameter="userid" password-parameter="password"/>
<sec:logout logout-url="/logout" logout-success-url="/login" delete-cookies="JSESSIONID" invalidate-session="true" />

<!-- User login (URL not View Name) -->
<sec:intercept-url pattern="/login" access="permitAll" />

<!-- User change password -->
<sec:intercept-url pattern="/change_password" access="permitAll" />


<sec:session-management invalid-session-url="/session_timeout">
<sec:concurrency-control max-sessions="1" error-if-maximum-exceeded="false" expired-url="/session_conflict"/>
</sec:session-management>

<sec:headers>
<sec:frame-options policy="SAMEORIGIN" />
</sec:headers>
</sec:http>

但问题是,

  1. 我需要从 session 检查(超时和并发)中排除某些页面,例如 login change_password

    /li>
  2. 如果我有一个可供登录用户或未登录用户访问的页面。但我只需要在用户登录时进行 session 超时和并发检查。

我应该如何实现?

非常感谢。

最佳答案

更新:我在我的一个 Spring Security 登录页面上测试了我原来的 session="false" 答案,但它没有用。请参阅下文以获得更好的解决方案。


原始答案:

将 <%@page session="false"%> 添加到 JSP 文件的顶部应该会阻止 session 启动,但这与 Spring Security 无关。

下面的 URL 中有一些非常简单的 Oracle 文档,上面写着:

JSP Default Session Requests

Generally speaking, servlets do not request an HTTP session by default. However, JSP page implementation classes do request an HTTP session by default. You can override this by setting the session parameter to false in a JSP page directive, as follows:

<%@ page ... session="false" %

https://docs.oracle.com/cd/A87860_01/doc/java.817/a83726/basics3.htm#1007356


更新的答案:问题可能与启用 CSRF 的 Spring Security 有关。它在 4.0 版中默认启用,这是一件好事,而不是您想禁用的东西。在早期版本中,可能需要手动操作。

CRSF token 需要一个 session ,因此您需要一个解决方案来仅在登录过程中排除 CSRF 测试。

有讨论"Relaxing CSRF"在 Spring 安全引用中。他们特别提到了 SockJS 但原理是通用的。他们为 JavaConfig 建议类似下面的行:

http.csrf().ignoringAntMatchers("/login")

已接受 answer by P.Peter for the SO question "CSRF token expires during login"有一个类似的解决方案,需要更多的努力。

您需要添加一个类来实现 Spring 的 RequestMatcher 类并覆盖它的 matches() 方法:

class CsrfSecurityRequestMatcher implements RequestMatcher {
@Override
public boolean matches(HttpServletRequest request) {
return !request.getServletPath().equals("/login");
}
}

如果您需要更复杂的匹配逻辑,您可以在自定义 RequestMatcher 类中添加 Pattern 和 RegexRequestMatcher 字段,并在 matches() 方法中使用它们。

然后您需要在 Spring Security 配置中添加对新类的引用。在 XML 中,它将是这样的:

<http>
<csrf request-matcher-ref="csrfSecurityRequestMatcher"/>
</http>

在 JavaConfig 中它会是这样的:

http.csrf().requireCsrfProtectionMatcher(new CsrfSecurityRequestMatcher());

我不确定在登录页面上禁用 CSRF 测试可能会产生哪些安全后果,因此您可能需要调查一下。

如果您认为禁用登录页面的 CSRF 是 Not Acceptable ,那么您可以使用 AJAX keepalive 解决方案来防止您的登录页面过期,但这对我来说有点老套。

关于java - 如何从 Spring Security 中的 session 管理(超时/并发检查)中排除某些页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37436792/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com