问题描述
我是 Spring Boot 的新手。我需要在 Spring Boot 中实现基于角色的授权。我有不同的角色,多个用户将被映射到每个角色。我将设置不同的访问权限(读取、添加、删除、编辑) 每当调用 api 时,都需要检查访问权限并允许权限。 我打算使用拦截器来调用具有查询的方法以从数据库获取访问权限并拒绝或访问 api。 我还有其他更好的方法可以使用吗?
解决方法
如果您使用的是 Spring Security,您可以使用方法安全注解(例如 @PreAuthorize
、@PostAuthorize
.. 甚至将它们组合到新注解中)来处理它。
首先你的用户需要实现 UserDetails 然后你应该根据你的角色和权限结构实现 getAuthorities()
方法 Spring Security 基本上检查 getAuthority() 方法返回什么,如果返回值以 "ROLE_"
为前缀,如 {{ 1}} 如果它没有前缀“ROLE_”,它将作为 ROLE 处理,它将作为授权处理
您可以使用方法注释来检查权限和角色,如下例所示:
"ROLE_ADMIN"
和 Spring Security 将通过 @PreAuthorize("hasRole('ROLE_ADMIN') and hasAuthority("READ")")
实现您的用户来检查您授予的权限,然后根据您的注释,Spring Security 代表您自动检查它。
为清楚起见,您可以检查 https://www.baeldung.com/spring-security-granted-authority-vs-role
为了快速工作实施,您可以查看下面的文章(我不会直接使用它,但您可以理解这个想法。您也可以使用权限但简单的解决方案可能是下面的解决方案。):
https://www.baeldung.com/role-and-privilege-for-spring-security-registration
,对于授权,也可以有以下两种方式:
- OAuth(参考 - https://medium.com/@bvulaj/mapping-your-users-and-roles-with-spring-boot-oauth2-a7ac3bbe8e7f)
- Spring 安全角色和权限(参考 - https://www.baeldung.com/role-and-privilege-for-spring-security-registration)
您可以创建自定义注释来处理每个角色的请求。您可以阅读此 article 以了解有关如何实施的更多详细信息。
并且在 api 中会有格式:
@GetMapping(...)
@YouCustomAnnotation("roleName")
public void doSomeThing(){
}
如果用户的角色与注解中定义的角色匹配,则调用此api,如果用户的角色不匹配,服务器将返回404代码。