我用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?
1条答案
按热度按时间brtdzjyr1#
像这样更改您的http配置并重试,
我希望这能奏效。
您也可以使用
要使用
@PreAuthorize
,您需要先启用它。要这样做,请使用GolbalMethodSecurityConfiguration
扩展MethodSecurityConfig
类,并添加一个注解prePostEnabled = true
使您的应用程序能够授权before (pre)
和after (post)
基础。轮到您了,哪一个适合您。