OAuth2 - 获取资源服务器中的权限以获取client_credential授权类型

时间:2015-03-13 15:44:06

标签: spring spring-security oauth-2.0 spring-security-oauth2

我尝试使用客户端凭据身份验证类型,但是当我想解码资源服务器中的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%¬ç

该角色由我的身份验证服务器中的UserDetailsS​​ervice(在提供程序中定义)设置。

我的验证对象没问题,角色设置为:

    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è

我没有任何身份验证提供程序,因此我没有userDetailsS​​ervice来设置角色,我唯一拥有的是使用此行在身份验证服务器中设置的权限:{{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它应该是当局......我不明白为什么会这样做......

0 个答案:

没有答案