【问题标题】:How to attach UserDetails to Principal received from JWT token using Spring Oauth2如何使用 Spring Oauth2 将 UserDetails 附加到从 JWT 令牌收到的 Principal
【发布时间】:2016-01-06 08:10:21
【问题描述】:

我有这些服务

  • 使用 JDBC 提供程序 (DB-1) 的 oauth2 身份验证服务器
  • 启用 Zuul 的 Web 应用程序代理对 authserver 和资源服务器的请求
  • 启用@EnableOauth2Resource (DB-2) 的资源

我需要使用从 DB-1 接收的凭据从 DB-2 获取资源服务器中的用户详细信息,并将启用的权限设置为当前 Principal,以便进一步使用 @RolesAllowed 注释的 @PreAuthorize。

在使用 oauth2 令牌成功进行身份验证后,是否有一些挂钩可以替换或更新 org.springframework.security.oauth2.provider.OAuth2Authentication?

【问题讨论】:

    标签: java spring oauth spring-security-oauth2


    【解决方案1】:

    我通过将我的资源服务器配置为..来获得资源服务器的主体。

    @Configuration
    @EnableResourceServer
    public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
    
    
        public ResourceServerConfiguration() {
            super();
        }
    
    
        @Override
        public void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests().anyRequest().authenticated();
        }
    
        /* returns org.springframework.security.core.userdetails.UserDetailsService */
        @Bean
        UserDetailsService customUserDetailsService () {
            return new CustomUserDetailsService();
        }
    
        @Bean
        public UserAuthenticationConverter userAuthenticationConverter () {
            DefaultUserAuthenticationConverter defaultUAC = new DefaultUserAuthenticationConverter();
            defaultUAC.setUserDetailsService(customUserDetailsService());
            return defaultUAC;
        }
    
        @Bean
        public AccessTokenConverter accessTokenConverter() {
            DefaultAccessTokenConverter defaultATC = new DefaultAccessTokenConverter();
            defaultATC.setUserTokenConverter(userAuthenticationConverter());
            return defaultATC;
        }
    
        @Bean
        RemoteTokenServices getRemoteTokenServices () {
            RemoteTokenServices rts = new RemoteTokenServices();
    rts.setCheckTokenEndpointUrl("http://localhost:9999/uaa/oauth/check_token");
            rts.setAccessTokenConverter(accessTokenConverter());
            rts.setClientId("yourClientID");
            rts.setClientSecret("yourClientSecret");
            return rts;
        }
        ...
    
    }
    

    基本上在这里,我们通过从 accesstoken 获取身份验证信息,使用 customUserDetailsS​​ervice 更新资源服务器上的身份验证主体。 RemoteTokenServices 查询 auth-server 的 /check_token 端点以获取访问令牌的内容。如果端点返回 400 响应,则表明令牌无效。

    【讨论】:

      【解决方案2】:

      如果使用 Spring Boot 并且可以通过标准方式获取您的用户详细信息,请首先查看 customizing user information 上的 Spring Boot 文档。

      如果您需要进一步控制,我建议提供 ResourceServerConfigurer 来提供自定义 ResourceServerTokenServices,它可以使用您需要的主体详细信息填充您的 OAuth2Authentication。

      OAuth2AuthenticationManager 或 OAuth2ClientAuthenticationProcessingFilter 向 ResourceServerTokenServices 传递了一个 accessToken,并期望得到一个填充的 OAuth2Authentication 作为回报。这使您有机会获取主体信息并将其填充到 OAuth2Authentication 对象中。

      同样,如果使用 Spring Boot,ResourceServerConfigurer,如果实例化为 bean,将被 OAuth2 自动配置拾取,并且您的 ResourceServerTokenServices 将被注册。

      @Configuration
      public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
      
          @Autowired
          private MyResourceServerTokenServices tokenServices;
      
          @Override
          public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
              resources.tokenServices(tokenServices);
          }
      }
      

      覆盖

      @Override
      public OAuth2Authentication loadAuthentication(String accessToken) {
          // fetch user information and return populated authentication
      }
      

      【讨论】:

        猜你喜欢
        • 2015-04-16
        • 2018-08-03
        • 2018-04-11
        • 2021-05-22
        • 2019-01-20
        • 2018-03-06
        • 2021-09-27
        • 2018-03-13
        • 2022-11-28
        相关资源
        最近更新 更多