相关疑难解决方法(0)

如何有条件地跳过Grails Spring Security插件过滤器链中的SecurityContextPersistenceFilter过滤器

我有一个独特的场景,我试图在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添加自定义RequestMatcherAuthenticationEntryPoint实现).但是,从文档和实验中可以看出,只过滤了路径.

有没有办法确保在URL上看到'sso = true'时,SSO过滤器在仍具有安全上下文可用性的情况下被命中,或者SecurityContextPersistenceFilter可以将请求传递给SSO过滤器?

grails spring-security grails-plugin

6
推荐指数
1
解决办法
1508
查看次数

如何阻止Spring Boot添加会话cookie?

我有一个 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 中也不需要。

session url-rewriting spring-boot

5
推荐指数
1
解决办法
4900
查看次数

如何在Spring Boot中禁用或覆盖RequestCacheAwareFilter

  1. 我有一个非常基本的简单Spring Boot Rest应用程序。
  2. 我需要在Spring Security中实现自定义身份验证:对于每个REST请求,我需要检查用户名和密码,这些名称和密码位于每个请求的特定标头(“用户名”和“密码”)中。

  3. 因此,我实现了自定义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)
  4. 因此,我意识到RequestCacheAwareFilter正在缓存第一个请求,并且标头也存储在缓存中。因此,如果我通过了错误的通过请求,然后又通过了正确的请求,我仍然会遇到异常。

那么,如何覆盖或禁用CacheAwareFilter?还是我做错了什么?

java spring spring-mvc spring-security spring-boot

2
推荐指数
2
解决办法
1521
查看次数