Spring Security + OAuth,如果访问令牌不存在则回退

Nic*_*ick 1 java spring spring-security oauth-2.0 spring-security-oauth2

我在我的应用程序中使用Spring Security来保护我的大多数端点.我正在使用Spring Security OAuth2来保护某个子集.OAuth受保护端点的这个子集将由外部服务器和资源服务器本身的用户访问.

是否可以在此端点上同时使用这两种保护,并使用 - 或?如果用户从外部服务器访问端点,他们将需要OAuth访问令牌才能进入,如果用户直接登录资源服务器,他们将没有访问令牌,但我想使用我的其他过滤器链做我的标准认证.

我之前从未见过带有两个独立过滤器链的HTTP块,但也许有一些我不知道的方法.

Dav*_*yer 6

我认为您不需要2个过滤器链用于受保护资源,只考虑一些访问规则,这些规则考虑了可能遇到的不同身份验证.该sparklr2演示是接受它/照片端点,例如饼干,以及令牌的资源服务器.在sparklr中,您有1个过滤器链(a WebSecurityConfigurerAdapter)用于登录和授权端点,1(a ResourceServerConfigurerAdapter)用于受保护的resourecs.默认情况下,ResourceServerConfigurerAdapter在应用之前应用WebSecurityConfigurerAdapter它,因此它必须与登录和授权资源匹配.相关匹配器和访问规则如下:

    @Override
    public void configure(HttpSecurity http) throws Exception {
        // @formatter:off
        http
            // Since we want the protected resources to be accessible in the UI as well we need 
            // session creation to be allowed (it's disabled by default in 2.0.6)
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
        .and()
            .requestMatchers().antMatchers("/photos/**", "/oauth/users/**", "/oauth/clients/**","/me")
        .and()
            .authorizeRequests()
                .antMatchers("/me").access("#oauth2.hasScope('read')")                  
                .antMatchers("/photos").access("#oauth2.hasScope('read') or (!#oauth2.isOAuth() and hasRole('ROLE_USER'))")                                        
        ...
    }
Run Code Online (Sandbox Code Playgroud)

在这里,您可以看到仅OAuth资源(/me)以及/photos因令牌访问规则而使用令牌或Cookie()的资源.