授权
1. 权限系统
以一个学校图书馆的管理系统为例,如果是普通学生就能看到借书、还书相关的功能,而不能让他看到并且甚至使用添加书籍、删除书籍的功能;但是如果是一个图书馆管理员的账号登录了,就需要能看到并使用这两个功能。
总结起来就是不同的用户可以使用不同的功能,这就是权限系统需要实现的效果。
我们不能只依赖前端去判断用户的权限来选择显示哪些菜单哪些按钮,因为如果只是这样,如果有人知道了对应功能的接口地址,就可以不通过前端而直接去发送请求来实现相关功能的操作了。所以还是需要在后台进行用户权限的判断。
2. Spring Security 的相关原理
2.1 过滤器
在 Spring Security 中,会使用默认的FilterSecurityInterceptor
来进行权限校验,在FilterSecurityInterceptor
中会从SecurityContextHolder
获取其中的Authentication
,然后获取其中的权限信息,以判断当前用户是否拥有访问当前资源所需的权限。
所以我们在项目中只需要把当前登录用户的权限信息也存入Authentication
,然后设置我们的资源所需权限即可。
2.2 注解
Spring Security 为我们提供了基于注解的权限控制方案,这也是项目中主要采用的方式。其使用过程如下:
开启相关配置:
@EnableGlobalMethodSecurity(prePostEnabled = true)
使用相应注解,如
@PreAuthorize
:@RequestMapping("/play/spring/security") @RestController public class HelloController { @PreAuthorize("hasAnyAuthority('test')") @GetMapping("/hello") public String sayHello() { return "Hello, spring security!"; } }
除了使用如@PreAuthorize
的各种权限控制注解外,权限配置也可以通过配置类中的配置来实现。即在WebSecurityConfigurerAdapter#configure(HttpSecurity)
中使用HttpSecurity
的相应方法。
2.3 权限如何分配?
观察UserDetails
接口的Collection<? extends GrantedAuthority> getAuthorities()
方法就可以了,想办法实现它。同时,在设置登录用户的Authentication
时,通过调用UserDetails#getAuthorities
方法将权限信息也存入其中。
3. 实践方案:RBAC 权限模型
没啥好说的了,实际项目中我们肯定是通过数据库来设置用户权限的,此时常常会用 RBAC 权限模型。略了略了。.....