首页 > 解决方案 > Spring security oauth2登录和资源服务器在同一个应用程序中

问题描述

我有一个应用程序,用户/应用程序可以使用 OpenID 提供程序或 JWT 令牌进行身份验证。这是我的spring安全配置类。

    @EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .anyRequest()
                .authenticated()
                .and()
                .oauth2Login()
                .userInfoEndpoint()
                .oidcUserService(oidcUserService()).and()
                .and()
                .oauth2ResourceServer()
                .jwt();
    }

private OAuth2UserService<OidcUserRequest, OidcUser> oidcUserService() {
    return oidcUserRequest -> {
        OidcUserService oidcUserService = new OidcUserService();
        OidcUser oidcUser = oidcUserService.loadUser(oidcUserRequest);
        return oidcUser;
    };
}

}

它按预期工作,但我想禁用 JWT 授权部分的会话创建。我需要将其拆分为多个配置吗?我知道,如果我们有多个配置类,我们需要根据 URL 模式进行区分,在我的情况下我无法做到这一点,因为通过 OpenId 或通过 JWT 进行身份验证的用户仍然应该能够访问相同的 URL。

这是Github中的完整示例代码。

标签: spring-securityspring-security-oauth2

解决方案


我通过将配置分成两个类来解决。一个用于 OAuth 登录,另一个用于资源服务器。在资源服务器Configuration http.requestMatcher(new RequestHeaderRequestMatcher("Authorization")) 类上进行配置,并将其 Order 设置为 1,Open Id 配置顺序设置为 2。在资源服务器配置中,我禁用了会话创建。

这样,如果任何外部客户端使用标头为“授权”的 JWT 令牌进行调用,则它将由资源服务器配置处理,否则将由第二个/OAuth 配置处理。


推荐阅读