Spring Security 中的 hasRole() 无法正常工作 [重复]
Posted
技术标签:
【中文标题】Spring Security 中的 hasRole() 无法正常工作 [重复]【英文标题】:hasRole() in spring security does not work properly [duplicate] 【发布时间】:2019-06-29 05:09:17 【问题描述】:我尝试在我的应用程序中扮演角色。但我一直有一条消息。
"status": 403, "error": "Forbidden", "message": "Forbidden",
在数据库中,我有列角色和值 USER 或 ADMIN
休息控制器
@GetMapping(value="/users")
@PreAuthorize("hasRole('ROLE ADMIN')")
public ResponseEntity<List<User>> getAllusers()
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
System.out.println(authentication.getAuthorities());
List<User> users = userService.findAll();
return new ResponseEntity<List<User>>(users, HttpStatus.OK);
如果我遇到@PreAuthorize
System.out.println(authentication.getAuthorities());
正确显示"ROLE ADMIN"
或"ROLE USER"
【问题讨论】:
您的角色不是ROLE_USER
,而是USER
。 hasRole
检查给定的权限,但会在其前面加上 ROLE_
使用 hasAuthority
代替。
我尝试使用 @PreAuthorize("hasRole('ADMIN')") 和 @PreAuthorize("hasRole('ROLE_ADMIN')") 并且一直出现错误 403
如前所述,hasRole
在传入的权限前加上ROLE_
导致检查您的用户是否拥有ROLE_ADMIN
的权限,因为它被命名为ADMIN
。请改用hasAuthority
。
【参考方案1】:
问题是您以错误的方式创建权限,权限应在 DB 角色前面加上 ROLE_
在您的情况下,它将是 ROLE_ADMIN
和 ROLE_USER
(您错过了下划线)
所以,您的UserDetails
的getAuthorities()
实现应该以适当的方式发挥作用,例如:
@Override
public Collection<? extends GrantedAuthority> getAuthorities()
List<SimpleGrantedAuthority> authorities = new ArrayList<SimpleGrantedAuthority>();
/* this is just a sample , you must implement bringing data from repository then prefix every string with ROLE_ */
authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
authorities.add(new SimpleGrantedAuthority("ROLE_USER"));
return authorities;
然后在您的控制器中,@PreAuthorize("hasRole('ADMIN')")
应该可以工作,(删除 ROLE_
),
你也可以使用hasAuthority(‘ROLE_ADMIN’),
【讨论】:
这个可行,权限名称应该是正确的。@PreAuthorize("hasRole('ROLE ADMIN')")
以上是关于Spring Security 中的 hasRole() 无法正常工作 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Spring Security 检查 Java 代码中的“hasRole”?
Spring security 中的hasAuthority()和hasRole() 有啥区别?
Spring security hasRole() 给出错误 403 - 访问被拒绝
Spring security 4 @PreAuthorize("hasRole()") 不起作用
如何对 Spring Security @PreAuthorize(hasRole) 进行单元测试?
Spring Security 'Roles' 和 'Privileges' 和 Thymeleaf 'hasRole' 和 'hasAuthority'