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,而是USERhasRole 检查给定的权限,但会在其前面加上 ROLE_ 使用 hasAuthority 代替。 我尝试使用 @PreAuthorize("hasRole('ADMIN')") 和 @PreAuthorize("hasRole('ROLE_ADMIN')") 并且一直出现错误 403 如前所述,hasRole 在传入的权限前加上ROLE_ 导致检查您的用户是否拥有ROLE_ADMIN 的权限,因为它被命名为ADMIN。请改用hasAuthority 【参考方案1】:

问题是您以错误的方式创建权限,权限应在 DB 角色前面加上 ROLE_ 在您的情况下,它将是 ROLE_ADMINROLE_USER(您错过了下划线)

所以,您的UserDetailsgetAuthorities() 实现应该以适当的方式发挥作用,例如:

@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'