2017-10-13 21 views
0

私はSpring SecurityでJWTを実装しました。hasRole()はJWTで動作しません

スプリングセキュリティ/login urlはロールを含むJWTを返しますが、ロールを必要とするURLにアクセスしようとすると、403を返します。

"timestamp": 1507840896561, 
    "status": 403, 
    "error": "Forbidden", 
    "message": "Access is denied", 
    "path": "/teacher/dashboard" 

は私が WebSecurityConfigurerAdapter拡張 WebSecurityConfigにこのような /teacher/**の役割を定義した:

http 
     .authorizeRequests() 
     .antMatchers("/").permitAll() 
     .antMatchers("/login").permitAll() 
     .antMatchers("/api/register").permitAll() 
     .antMatchers("/teacher/**").hasRole("TEACHER") 
     .anyRequest().authenticated() 

     .and() 
     .formLogin() 
     .loginPage("/login") 
     .permitAll() 

     .and() 
     .logout() 
     .permitAll(); 
http 
     .csrf().disable(); 
http 
     .formLogin() 
     .defaultSuccessUrl("/", true) 

     .and() 
     .addFilterBefore(new SimpleCorsFilter(), ChannelProcessingFilter.class) 

     .addFilter(new JWTAuthenticationFilter(authenticationManager())) 
     .addFilter(new JWTAuthorizationFilter(authenticationManager())); 

私はROLE_TEACHERとしてhasRole()のためのパラメータを設定しようとしましたが、春のセキュリティはROLE_接頭辞を使用しないように私に警告しました。私もhasAuthority("TEACHER") and again got 403を試しました。私のJWTの

ペイロード:

{ 
    "sub": "[email protected]: Username: [email protected]; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: ROLE_TEACHER", 
    "exp": 1508704641 
} 

トークンはGranted Authorities: ROLE_TEACHER持っていますが、私がアクセス拒否エラーを取得しておきます。何か不足しているのですか、またはURLの役割を定義するための実装が他にありますか?

+0

あなたの質問に「DEBUG」レベルが設定された(ログ設定で)Springセキュリティログを追加してください。 – dur

答えて

1
が、これは正常に動作します

.antMatchers("/teacher/**").access("hasAnyRole('TEACHER')") 

望み、そのようなあなたのhttpの設定を変更し、再試行してください

また、あなたが最初にそれを有効にする必要が@PreAuthorizeを使用するには

@PreAuthorize("hasRole('ROLE_TEACHER')") 

を使用して、メソッドレベルのセキュリティでの役割を確認することができます。それはGolbalMethodSecurityConfigurationであなたのMethodSecurityConfigクラスを拡張を行うと

@EnableGlobalMethodSecurity(prePostEnabled = true, proxyTargetClass = true) 

prePostEnabled = true注釈を追加するにはbefore (pre)after (post)基礎を承認するようにアプリケーションを可能にします。 1つはあなたのために適しています。

+0

私は最初にあなたの第1の解決策を試し、再び403を得ました。それから私は2番目を試みました、そして、私がトークンかどんな役割を持っていたかどうかにかかわらず私はURLにアクセスできました。私はまだ成功することができませんでした。 – Eniss

+0

リクエストが来たときにコードをデバッグし、リクエストにどのような役割が存在するかを確認します。 'request.isUserInRole()'のようなもの –

関連する問題