我有一个独特的场景,我试图在Spring Security插件的限制下解决(版本1.2.7.3,如果很奇怪).我创建了一个自定义SSO插件,允许使用签名URL登录.自定义插件工作得很好,我根据文档添加了在resources.groovy中创建bean并添加到BootStrap.groovy中的过滤器链中.
SpringSecurityUtils.clientRegisterFilter('ssoFilter', SecurityFilterPosition.SECURITY_CONTEXT_FILTER.order + 10)
Run Code Online (Sandbox Code Playgroud)
一旦用户登录,一切运行良好,并且添加到安全上下文的现有活动会话将对用户进行身份验证.
我有一个用例,在这个用例中,已经过身份验证的用户可能会在SSO请求中使用不同的用户返回到同一浏览器(即同一会话cookie).我想让过滤器链注意到URL的查询字符串中的'sso = true'.
我现在看到的行为是从未到达SSO,因为原始用户已经被安全上下文认证.我无法在SecurityContextPersistenceFilter之前添加SSO过滤器,因为这会导致SSO过滤器不断被命中并且实际上没有呈现任何内容的问题.这遵循文档,我已经看到它说你不应该在安全上下文过滤器之前放置任何过滤器.
我已经考虑使用springsecurity.filterChain.chainMap配置说明,专门为具有'sso = true'的URL创建一个特殊的过滤器链(我在未经身份验证的流程中通过向DelegatingAuthenticationEntryPoint添加自定义RequestMatcher和AuthenticationEntryPoint实现).但是,从文档和实验中可以看出,只过滤了路径.
有没有办法确保在URL上看到'sso = true'时,SSO过滤器在仍具有安全上下文可用性的情况下被命中,或者SecurityContextPersistenceFilter可以将请求传递给SSO过滤器?
我有一个 Spring Boot Web 应用程序,我正在尝试将其设为无状态。在我的 WebSecurityConfigurerAdapter 中我设置了
http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
Run Code Online (Sandbox Code Playgroud)
但应用程序(使用 Thymeleaf 模板)通过;jsessionid=<some_session_id>在文件名后附加“”来不断重写图像和脚本的 URL。除了给我一个我不想要的 cookie 之外,它还有一个恼人的副作用,即 Spring Security 会阻止请求,因为它的 URL 中有分号!
Thymeleaf表示这是预期和期望的行为,并表示这不是他们的错:Thymeleaf 只是要求“Servlet API”重写 URL,而我们应该“在 Tomcat 上下文级别配置应用程序”来解决问题。
那么,我该怎么做呢?我有一个用于授权的自定义 JWT cookie,因此我根本不需要会话 cookie,当然在重写的 URL 中也不需要。
我需要在Spring Security中实现自定义身份验证:对于每个REST请求,我需要检查用户名和密码,这些名称和密码位于每个请求的特定标头(“用户名”和“密码”)中。
因此,我实现了自定义AuthEntryPoint:
@Service
public class CustomAuthEntryPoint implements AuthenticationEntryPoint {
@Override
public void commence(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException, ServletException {
String username = httpServletRequest.getHeader("username");
String password = httpServletRequest.getHeader("password");
if (!username.equals("admin") || !password.equals("admin")) {
throw new RuntimeException("", new BadCredentialsException("Wrong password"));
}
}
}Run Code Online (Sandbox Code Playgroud)因此,我意识到RequestCacheAwareFilter正在缓存第一个请求,并且标头也存储在缓存中。因此,如果我通过了错误的通过请求,然后又通过了正确的请求,我仍然会遇到异常。
那么,如何覆盖或禁用CacheAwareFilter?还是我做错了什么?