【问题标题】:Differents authentication ways on same URLs with spring-boot使用 spring-boot 对相同 URL 进行不同的身份验证方式
【发布时间】:2015-03-19 16:53:40
【问题描述】:

我正在开发一个由注释配置的 Spring Boot Web 应用程序项目。我成功配置了 spring-security 以在某些 URL 上添加基本身份验证,并在其他一些 URL 上添加 sso。 但实际上我必须修改这种行为来实现这一点:

我所有的 URL 都受这两种身份验证方法的保护,要确定使用方式,我必须阅读请求的标头:如果有 ppauth 令牌,我会尝试 sso 身份验证,如果我有授权:基本标头我要尝试基本身份验证。在另一种情况下,身份验证失败。

在spring boot文档中的例子很简单,展示了WebSecurityConfigurerAdapter的用法,实际上我们可以通过不同的URLs模式确定认证方法,而不是通过其他谓词如headers。

有人有想法吗?

【问题讨论】:

    标签: java spring authentication spring-security spring-boot


    【解决方案1】:

    我终于找到了解决这个问题的方法,所以我将简要分享一下:

    所以我们有多种身份验证方式,在扩展AbstractPreAuthenticatedProcessingFilter 的几个类中进行了描述。 (所有这些都不会添加到过滤器链中)

    最重要的是我们得到了一个MultiAuthModeSecurityFilter,这个类将被添加到应用程序的过滤器链中:

    WebSecurityConfigurerAdapterconfigure方法内

    http.addFilterBefore(new MultiAuthModeSecurityFilter(
                    FirstSecurityFilter(),
                    SecondSecurityFilter(),
                    ThirdSecurityFilter()), RequestCacheAwareFilter.class);
    

    所以MultiAuthModeSecurityFilter 知道我们所有的安全策略,并将通过以下操作将请求分派到正确的过滤器:

        @Override
            public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
                /*some actions to define the right authMethod to use*/
                switch (authMethod) {
                    case FIRST:
                        firstFilter.doFilter(servletRequest, servletResponse, filterChain);
                        break;
                    case SECOND:
                        secondFilter.doFilter(servletRequest, servletResponse, filterChain);
                        break;
                    case THIRD:
                        thirdFilter.doFilter(servletRequest, servletResponse, filterChain);
                        break;
                    default:
                        /* throws exception */ break;
                }
            }
    

    希望对你有帮助!

    【讨论】:

      【解决方案2】:

      做某事的方法总是不止一种。在这种情况下,最简单的方法可能是编写您的 sso 过滤器,使其在没有自定义标头的情况下继续使用链,并将其放在基本身份验证过滤器之前。然后,如果您的自定义过滤器跳过请求,它将由基本身份验证处理。

      【讨论】:

      • 你有一些关于如何使用 spring boot 的例子吗?
      猜你喜欢
      • 2020-08-07
      • 2013-07-26
      • 2015-11-22
      • 1970-01-01
      • 2020-10-29
      • 1970-01-01
      • 2018-08-29
      • 2023-03-19
      • 1970-01-01
      相关资源
      最近更新 更多