我有一个配置为设置有关用户权限的其他信息的oAuth2 jwt令牌服务器。
@Configuration
@Component
public class CustomTokenEnhancer extends JwtAccessTokenConverter {
CustomTokenEnhancer(){
super();
}
@Override
public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) {
// TODO Auto-generated method stub
MyUserDetails user = (MyUserDetails) authentication.getPrincipal();
final Map<String, Object> additionalInfo = new HashMap<>();
@SuppressWarnings("unchecked")
List<GrantedAuthority> authorities= (List<GrantedAuthority>) user.getAuthorities();
additionalInfo.put("authorities", authorities);
((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(additionalInfo);
return accessToken;
}
}
我不知道如何配置我的资源服务器,以提取oauth2服务器设置的用户权限,并将该权限用于Spring Security framework中的@Secured annotated Controller。
我的Auth服务器配置如下:
@Configuration
@EnableAuthorizationServer
public class OAuth2Config extends AuthorizationServerConfigurerAdapter {
@Value("${config.oauth2.privateKey}")
private String privateKey;
@Value("${config.oauth2.publicKey}")
private String publicKey;
@Value("{config.clienturl}")
private String clientUrl;
@Autowired
AuthenticationManager authenticationManager;
@Bean
public JwtAccessTokenConverter customTokenEnhancer(){
JwtAccessTokenConverter customTokenEnhancer = new CustomTokenEnhancer();
customTokenEnhancer.setSigningKey(privateKey);
return customTokenEnhancer;
}
@Bean
public JwtTokenStore tokenStore() {
return new JwtTokenStore(customTokenEnhancer());
}
@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
oauthServer
.tokenKeyAccess("isAnonymous() || hasRole('ROLE_TRUSTED_CLIENT')") // permitAll()
.checkTokenAccess("hasRole('TRUSTED_CLIENT')"); // isAuthenticated()
}
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints
.authenticationManager(authenticationManager)
.tokenStore(tokenStore())
.accessTokenConverter(customTokenEnhancer())
;
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
String url = clientUrl;
clients.inMemory()
.withClient("public")
.authorizedGrantTypes("client_credentials", "implicit")
.scopes("read")
.redirectUris(url)
.and()
.withClient("eagree_web").secret("eagree_web_dev")
//eagree_web should come from properties file?
.authorities("ROLE_TRUSTED_CLIENT")
.authorizedGrantTypes("client_credentials", "password", "authorization_code", "refresh_token")
.scopes("read", "write", "trust")
.redirectUris(url).resourceIds("dummy");
}
}
我的资源服务器配置如下所示:
@Configuration
@EnableResourceServer
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
@Value("{config.oauth2.publicKey}")
private String publicKey;
@Autowired
CustomTokenEnhancer tokenConverter;
@Autowired
JwtTokenStore jwtTokenStore;
@Bean
public JwtTokenStore jwtTokenStore() {
tokenConverter.setVerifierKey(publicKey);
jwtTokenStore.setTokenEnhancer(tokenConverter);
return jwtTokenStore;
}
@Bean
public ResourceServerTokenServices defaultTokenServices() {
final DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
defaultTokenServices.setTokenEnhancer(tokenConverter);
defaultTokenServices.setTokenStore(jwtTokenStore());
return defaultTokenServices;
}
@Override
public void configure(HttpSecurity http) throws Exception {
super.configure(http);
// @formatter:off
http
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER)
.and()
.requestMatchers()
.antMatchers("/**")
.and()
.authorizeRequests()
.antMatchers(HttpMethod.OPTIONS, "/api/**").permitAll()
.antMatchers(HttpMethod.GET, "/api/**").access("#oauth2.hasScope('read')")
.antMatchers(HttpMethod.PATCH, "/api/**").access("#oauth2.hasScope('write')")
.antMatchers(HttpMethod.POST, "/api/**").access("#oauth2.hasScope('write')")
.antMatchers(HttpMethod.PUT, "/api/**").access("#oauth2.hasScope('write')")
.antMatchers(HttpMethod.DELETE, "/api/**").access("#oauth2.hasScope('write')")
.antMatchers("/admin/**").access("hasRole('ROLE_USER')");
// @formatter:on
}
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
System.out.println("Configuring ResourceServerSecurityConfigurer ");
resources.resourceId("dummy").tokenServices(defaultTokenServices());
}
}
我的测试用例失败得很惨,它说:
{“error”:“invalid_token”,“error_description”:“Cannot convert access token to JSON”}
如何从JWT中获取身份验证对象?如何使用客户端凭据对客户端进行身份验证?如何在资源控制器上使用@Secured注释?
资源服务器端使用什么代码来解码令牌以提取客户端凭据,以及哪些代码用于验证用户角色?
请帮忙,因为我已经花了两天的时间来完成这个看似简单的任务。
注意:我从身份验证服务器接收到的令牌是:{access_-token=b5d89a13-3c8b-4bda-b0f2-a6e9d7b7a285,token_-type=bearer,refresh_-token=43777224-b6f2-44d7-bf36-4e1934d32cbb,expires_-in=43199,scope=读写信任,authorities=[{authority=ROLE_-USER},{authority=ROLE_-ADMIN}]
请解释这些概念,并指出我的配置中是否有任何缺失。我需要知道配置我的资源和身份验证服务器的最佳实践。
在下面,我指的是我已经成功实现的这个Baeldung教程:http://www.baeldung.com/spring-security-oauth-jwt
首先:在AuthorizationServer端使用CustomToken增强器,通过附加自定义信息增强已创建的令牌。您应该在ResourceServer端使用所谓的DefaultAccessTokenConzer来提取这些额外的声明。
您可以@Autowire
将CustomAccessTokenConverter设置到ResourceServerConfiguration类中,然后将其设置为JwtTokenStore()
配置。
资源服务器配置:
@Autowired
private CustomAccessTokenConverter yourCustomAccessTokenConverter;
@Bean
public TokenStore tokenStore() {
return new JwtTokenStore(accessTokenConverter());
}
@Bean
public JwtAccessTokenConverter accessTokenConverter() {
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
converter.setAccessTokenConverter(yourCustomAccessTokenConverter);
converter.setSigningKey(yourSigningKey);
return converter;
}
可以配置CustomAccessTokenConverter,以便在此处提取自定义声明。
CustomAccessTokenConverter:
@Component
public class CustomAccessTokenConverter extends DefaultAccessTokenConverter {
@Override
public OAuth2Authentication extractAuthentication(Map<String, ?> claims) {
OAuth2Authentication authentication = super.extractAuthentication(claims);
authentication.setDetails(claims);
return authentication;
}
}
(见:https://github.com/Baeldung/spring-security-oauth/blob/master/oauth-resource-server-1/src/main/java/org/baeldung/config/CustomAccessTokenConverter.java)
我们的项目中使用的是Spring Cloud config server,它有多个微服务。配置服务器就绪后,我们现在将所有微服务的所有属性存储在一个中央git存储库中。每个微服务能够根据应用程序名称和配置文件提取自己的属性文件。我们试图将资源包存储在中央存储库中,并让config-server将这些资源包提供给微服务。我们的资源包包括属性文件,如messages_en.properties、mes
我有一个单独的身份验证服务器和一个资源服务器——都是Spring Boot应用程序。我使用OAuth2和JWT令牌进行身份验证和授权。 我可以通过访问身份验证服务器获得令牌: 并通过将令牌附加到请求标头来从资源服务器(在不同的服务器上运行)获取资源时使用它。 但我不清楚的是,确定哪个用户登录了资源服务器。 在auth服务器中,我可以这样做: 此终结点将根据所使用的令牌获取当前用户。如果我尝试在资源
我在springboot中用jwt令牌开发了一个oauth2服务器,我在注销时遇到了困难http://www.baeldung.com/spring-security-oauth-revoke-tokens 注销后,如果在头中提供令牌并点击/user,则它将提供所有用户信息,而应该抛出并错误地表示用户已注销
我有两个云运行服务:和。前端是用vue.js/nuxt.js编写的,因此使用的是节点后端。后端是用Kotlin编写的,带有Spring Boot。 为了在前端和后端之间进行经过身份验证的内部通信,我需要使用一个令牌thttps://cloud.google.com/run/docs/authenticating/service-to-service#JavaHat是从google Metaserv
我正在使用spring boot资源服务器。身份验证服务器发出JWT。这个JWT使用密钥重新编码(使用AES),在资源服务器中,我应该在将JWT发送到JwtAuthenticator之前对其进行解码(来自AES)<现在,我有一个安全配置。 和JWT解码器 那我该怎么办?函数应该返回org。springframework。安全oauth2.jwt。Jwt。如何将字符串令牌转换为Jwt<我尝试了以下方
我有一个顶点。x REST服务接收带有jwt令牌的请求,我想调用另一个传递接收到的令牌的REST服务。在路由器处理程序和WebClient调用之间,我有一个业务逻辑层。我的问题是,除了通过我的业务逻辑层显式地传递令牌之外,是否有其他方法可以向webClient提供令牌?换句话说,是否可以从vertxContext或其他组件中以某种方式检索我的RoutingContext和令牌? 示例代码演示了我想