使用spring-boot在相同的URL上区分身份验证方式

时间:2015-01-21 08:31:22

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

我正在开发一个由注释配置的spring boot web app项目。我成功配置了spring-security,在某些URL上添加了基本身份验证,在其他URL上添加了sso。 但实际上我必须修改这种行为才能实现这个目标:

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

在spring boot文档中,这个例子非常简单,它显示了WebSecurityConfigurerAdapter的用法,实际上我们可以通过不同的URL模式确定身份验证方法,但不能通过其他类似谓词的谓词来确定。

有人有想法吗?

2 个答案:

答案 0 :(得分:0)

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

处理

答案 1 :(得分:0)

最后我得到了一个解决这个问题的方法,所以我将简要地分享一下:

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

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

configure

WebSecurityConfigurerAdapter方法内
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;
            }
        }

希望这会对你有帮助!