我尝试使用客户端凭据身份验证类型,但是当我想解码资源服务器中的JWT令牌时,我无法访问我在身份验证中设置的权限服务器... 在我的身份验证服务器中,我有类似这样的内容:
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("mkt-cms")
.authorizedGrantTypes("password")
.authorities("ROLE_ADMIN")
.scopes("read", "write", "trust")
.accessTokenValiditySeconds(accessTokenValiditySeconds)
.and()
.withClient("myClientA")
.authorizedGrantTypes("client_credentials")
.authorities("ROLE_CLIENTA")
.scopes("read")
.secret("mySecret")
.accessTokenValiditySeconds(accessTokenValiditySeconds);
}
在我的授权服务器中,我有:
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/**/products").hasRole(""ADMIN")
.antMatchers("/**/submissions/pending-approval").access("#oauth2.clientHasRole('CLIENTA')")
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
我使用的是JWT令牌。
在第一种情况下(工作案例 - 身份验证类型=密码):
当应用代表用户时,没问题,我有一个像这样解码的令牌:
{"alg":"HS256"}{"user_name":"emil.brigand","scope":
["read","write","trust"],"exp":1426344414,"authorities":
["ROLE_ADMIN"],
"jti":"5f03d88f-d5bc-497d-b2f3-054cb6389407","client_id":"mkt-cms","username":"emil.brigand"}W.d0Þ.Óy®wÊ_̸ÃR%¬ç
该角色由我的身份验证服务器中的UserDetailsService(在提供程序中定义)设置。
我的验证对象没问题,角色设置为:
org.springframework.security.authentication.UsernamePasswordAuthenticationToken
@a02f59a4: Principal: emil.brigand; Credentials: [PROTECTED]; Authenticated:
true; Details: null; Granted Authorities: ROLE_ADMIN
因此,用户可以访问类似"/**/products"
的URL。
在第二种情况下(非工作案例 - 身份验证类型= cleint_credentials):
当应用获得令牌时,解码的令牌如下:
{"alg":"HS256"}{"scope":["read"],"exp":1426345300,"authorities":
[{"authority":"ROLE_CLIENTA"}],"jti":"2b16b2fb-67ea-4068-a96a-
7d8314fa0cde","client_id":"myClientA"}vÊ»w¤qØ:Lɯ@½'ö$'11è
我没有任何身份验证提供程序,因此我没有userDetailsService来设置角色,我唯一拥有的是使用此行在身份验证服务器中设置的权限:{{1} } 当我做这样的事情时,我希望能够在我的资源服务器上添加规则:
.authorities("ROLE_CLIENTA")
我试过了:.antMatchers("/**/submissions/pending-
approval").access("#oauth2.clientHasRole('CLIENTA')")
但是效果不好......
我获得的身份验证对象是这样的:
.antMatchers("/**/submissions/pending-approval").hasAuthority("CLIENTA")
编辑:
我发现当提取令牌并设置了OAuth2Authentication对象时,忽略了权限(设置为null),我们可以看到在Spring类中:DefaultAccessTokenConverter.extractAuthentication,OAuth2Request构造函数的第三个参数为null它应该是当局......我不明白为什么会这样做......