Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring oauth2-基于java配置的用户id自定义令牌增强器_Java_Spring Security_Spring Security Oauth2 - Fatal编程技术网

Spring oauth2-基于java配置的用户id自定义令牌增强器

Spring oauth2-基于java配置的用户id自定义令牌增强器,java,spring-security,spring-security-oauth2,Java,Spring Security,Spring Security Oauth2,我实现了一个RESTfulAPI,并使用SpringSecurityOAuth和资源所有者密码凭据授权。 我希望避免在API中使用会话,所以每次用户调用API时,我都会检查数据库中的令牌 当一个经过身份验证的用户调用API(例如使用URI GET/users)时,我需要从当前用户那里获取用户ID以使用我的业务服务。我的业务服务使用userId而不是userName,并允许我检索当前用户信息或检查是否允许当前用户执行某些操作 目前,我通过JdbcTokenStore存储用户名和令牌。所以每次我都可

我实现了一个RESTfulAPI,并使用SpringSecurityOAuth和资源所有者密码凭据授权。 我希望避免在API中使用会话,所以每次用户调用API时,我都会检查数据库中的令牌

当一个经过身份验证的用户调用API(例如使用URI GET/users)时,我需要从当前用户那里获取用户ID以使用我的业务服务。我的业务服务使用userId而不是userName,并允许我检索当前用户信息或检查是否允许当前用户执行某些操作

目前,我通过JdbcTokenStore存储用户名和令牌。所以每次我都可以使用存储的用户名从数据库中检索userId。但是这个解决方案太重了,它迫使我在使用服务之前为令牌和用户访问数据库两次,这对性能来说太糟糕了

因此,为了解决这个问题,我想用令牌存储userId。使用这个解决方案,当我从数据库中获取令牌时,我拥有当前的用户ID,我可以用这个直接调用服务

问题是我无法成功地将自定义令牌增强器设置为默认令牌服务

下面是我在扩展OAuth2ServerConfigurerAdapter的securityConfig中的实现:

    @Override
protected void configure(AuthenticationManagerBuilder authManagerBuilder) throws Exception {
    authManagerBuilder
    .userDetailsService(new CustomUserDetailsService(userService))
    .passwordEncoder(passwordEncoder())
        .and()
    .apply(new InMemoryClientDetailsServiceConfigurer())
        .withClient("ios-app")
        .resourceIds(RESOURCE_ID)
    .scopes("read", "write")
    .authorities("ROLE_USER")
    .authorizedGrantTypes("password")
    .secret("123456");
}

@Override
protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        http.requestMatchers()
        .and()
        .authorizeRequests()
        .antMatchers("users/create").permitAll()
        .anyRequest().authenticated()
        .and()
        .apply(new OAuth2ServerConfigurer())
        .tokenStore(new JdbcTokenStore(dataSource))
        .resourceId(RESOURCE_ID);
    }

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}
下面是tokenService的覆盖以添加自定义令牌增强器,但它不起作用:

    @Override
public AuthorizationServerTokenServices tokenServices() throws Exception {
    DefaultTokenServices tokenService = (DefaultTokenServices)tokenServices();
    tokenService.setTokenEnhancer(new CustomTokenEnhancer());
    return tokenService;
}

有人有其他想法吗?

我也做过类似的事情,但没有使用令牌增强器。我扩展了DefaultTokenServices,将附加信息存储在OAuth2AccessToken对象的additionalInformation映射中。感谢您的回复。实际上,我无法使用我的配置扩展DefaultTokenServices,因为上面的覆盖执行stackoverflowException。使用基于java的配置成功了吗?您使用哪个版本的SpringOAuth2?我刚刚在github上看到了这个链接[我看到一个问题正在得到解决。很抱歉,我没有扩展DefaultTokenServices,但创建了一个新的实现,从中提取代码并根据需要进行修改。我必须相应地更新我的bean声明。我在这里分享了一些更改。不确定如何使用上述配置实现。谢谢,我将尝试实现sim我将在这里发布带有java配置的ilar解决方案。否则,如果它没有更改,我将返回xml配置。您好,NaEs,我是oauth和spring安全的新手,我想与rest api和数据库集成。但是我对配置感到困惑,所以,请建议我从哪里开始oauth和spring安全数据库配置?