2016-08-31 18 views
3

私はSpring OAuthを使って遊んでおり、承認サーバとリソースサーバを実装しています。リソースサーバーはuser-info-uriを使用してトークンをデコードします。Spring Security/OAuth:@RolesAllowedにおけるプリンシパルの権限とロールのマッピング

リソースサーバーのコントローラ内のメソッド(一部)は、@RolesAllowed(@PreAuthorize、同じ効果を試しました)によって保護されています。

@RolesAllowed("ROLE_USER") 
//@PreAuthorize("hasRole('ROLE_USER')") 
@RequestMapping(value = "/test-user", method = RequestMethod.GET) 
public String testUser() { 
    return "You are User!"; 
} 

3人のユーザーがありますが、認証サーバ側で管理:ROLE_USERとROLE_ADMINとユーザー1、ユーザー2とユーザー3を。

リソースサービスは、認証サーバー(パスワード許可フロー)によって生成されたトークンを受け入れ、プリンシパルの詳細についてuser-info-uriに問い合わせます。これまでのところ、設計通りに動作します。

しかし、何が起こったのか、私は理解していないものです。

"principal": { 
    "password": null, 
    "username": "user2", 
    "authorities": [ 
     { 
     "authority": "ROLE_USER" 
     } 
    ], 
    "accountNonExpired": true, 
    "accountNonLocked": true, 
    "credentialsNonExpired": true, 
    "enabled": true 
    }, 

そして、正しく非直列化しているように見える:主要な構造(たとえば、user2のために、ROLE_USERを持つ)は、(私は、ユーザーの情報-URIを手動で呼び出しを行った例の目的のために)正しい権限が含まれていますリソースサーバ側で:

2016-08-31 12:30:37.530 DEBUG 32992 --- [nio-9998-exec-1] o.s.s.a.i.a.MethodSecurityInterceptor : Secure object: ReflectiveMethodInvocation: public java.lang.String org.cftap.OAuthResourceController.testUser(); target is of class [org.cftap.OAuthResourceController]; Attributes: [ROLE_USER, ROLE_USER] 
2016-08-31 12:30:37.530 DEBUG 32992 --- [nio-9998-exec-1] o.s.s.a.i.a.MethodSecurityInterceptor : Previously Authenticated: or[email protected]ed03ae2: Principal: user2; Credentials: [PROTECTED]; Authenticated: true; Details: remoteAddress=0:0:0:0:0:0:0:1, tokenType=BearertokenValue=<TOKEN>; Granted Authorities: {authority=ROLE_USER} 
2016-08-31 12:30:37.530 DEBUG 32992 --- [nio-9998-exec-1] o.s.s.access.vote.AffirmativeBased  : Voter: org.springframewor[email protected]4cf62e16, returned: 0 
2016-08-31 12:30:37.530 DEBUG 32992 --- [nio-9998-exec-1] o.s.s.access.vote.AffirmativeBased  : Voter: [email protected]38f, returned: -1 
2016-08-31 12:30:37.530 DEBUG 32992 --- [nio-9998-exec-1] o.s.s.access.vote.AffirmativeBased  : Voter: [email protected], returned: -1 
2016-08-31 12:30:37.531 DEBUG 32992 --- [nio-9998-exec-1] o.s.s.access.vote.AffirmativeBased  : Voter: [email protected]a21f, returned: 0 
2016-08-31 12:30:37.536 DEBUG 32992 --- [nio-9998-exec-1] o.s.b.a.audit.listener.AuditListener  : AuditEvent [timestamp=Wed Aug 31 12:30:37 CEST 2016, principal=user2, type=AUTHORIZATION_FAILURE, data={type=org.springframework.security.access.AccessDeniedException, message=Access is denied}] 
2016-08-31 12:30:37.546 DEBUG 32992 --- [nio-9998-exec-1] o.s.s.w.a.ExceptionTranslationFilter  : Access is denied (user is not anonymous); delegating to AccessDeniedHandler 

しかし、あなたはデバッグログに見るように、RoleVoter(およびJSR250 1)(許可役割とプリンシパルの権限を組み合わせるが)、それに対する投票は、それゆえ送信します403バック。

私は何か重要なことを忘れましたか?

ありがとうございます。

答えて

2

@RolesAllowed("ROLE_USER")の代わりに @RolesAllowed("USER")を試してください。

最終的にhasRole("ROLE_USER")の代わりにhasAuthority("ROLE_USER")またはhasRole("USER")を使用できます。

これはSpring 4からの変更です。おそらく古いSpring 3のドキュメント/記事を使用しています。

+0

@RolesAllowed( "USER")helped –

関連する問題