spring-security Spring安全性hasRole()不适用于JWT

1dkrff03  于 2022-11-11  发布在  Spring
关注(0)|答案(1)|浏览(158)

我用Spring Security实现了JWT。
Spring Security /login url返回一个包含角色的JWT,但是当我尝试访问一个需要角色的URL时,它返回403

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

我在WebSecurityConfig中为/teacher/**定义了一个角色,它扩展了WebSecurityConfigurerAdapter

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()));

我尝试将hasRole()的参数设置为ROLE_TEACHER,Spring Security警告我不要使用ROLE_前缀。我还尝试了hasAuthority("TEACHER") and again got 403 '。
我的JWT的有效负载:

{
  "sub": "org.springframework.security.core.userdetails.User@394ca6ef: Username: teacher@postman.com; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: ROLE_TEACHER",
  "exp": 1508704641
}

令牌有Granted Authorities: ROLE_TEACHER,但我一直得到访问被拒绝的错误。我错过了什么或有任何其他实现定义的角色的url?

brtdzjyr

brtdzjyr1#

像这样更改您的http配置并重试,

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

我希望这能奏效。
您也可以使用

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

要使用@PreAuthorize,您需要先启用它。要这样做,请使用GolbalMethodSecurityConfiguration扩展MethodSecurityConfig类,并添加一个注解

@EnableGlobalMethodSecurity(prePostEnabled = true, proxyTargetClass = true)

prePostEnabled = true使您的应用程序能够授权before (pre)after (post)基础。轮到您了,哪一个适合您。

相关问题