史上最简单的Spring Security教程(十二):注解实现权限控制
我们前面讲的所有的例子,都是没有权限控制的,也就是只要登录就可以访问任何资源,不需要其它的权限。但是,现实生活中肯定不是这样。
比如你是普通员工,只能查看自己的工作记录;而部门经理作为领导,则可以查看整个部门员工的工作记录;再如企业老板,作为最大的权限拥有者,可以查看整个公司员工的工作记录。这就是所谓的权限控制,不同角色拥有的不同资源。
而 Spring Security 框架最大的功用就在于此。当然,实现权限控制体系非常复杂,我们一步一步来,本次先讲一个如何通过注解实现权限控制需求。
Spring Security 配置类开启权限控制注解,即 @EnableGlobalMethodSecurity(prePostEnabled = true)。
@EnableGlobalMethodSecurity(prePostEnabled = true)
@EnableWebSecurity
@Configuration
public class SpringSecurityConfiguration extends WebSecurityConfigurerAdapter {
......
}
在需要进行权限控制的 controller 方法上添加权限控制注解 @PreAuthorize。
@PreAuthorize("hasRole('User')")
@RequestMapping("/index")
public String index() {
return "/user/index";
}
这里解释一下 @PreAuthorize 注解的参数含义。先来看一下其注释:
从注释可以看到,value (可省略)属性是 Spring-EL 表达式类型的字符串。其值可参考类 SecurityExpressionRoot,这是Spring Security 框架封装的专门针对 Spring Security 框架本身的 Spring—EL表达式解析类。
分别介绍以下其中值选项。
-
hasRole,对应 public final boolean hasRole(String role) 方法,含义为必须含有某角色(非ROLE_开头),如有多个的话,必须同时具有这些角色,才可访问对应资源。
-
hasAnyRole,对应 public final boolean hasAnyRole(String... roles) 方法,含义为只具有有某一角色(多多个角色的话,具有任意一个即可),即可访问对应资源。
-
hasAuthority,对应 public final boolean hasAuthority(String authority) 方法,含义同 hasRole,不同点在于这是权限,而不是角色,区别就在于权限往往带有前缀(如默认的ROLE_),而角色只有标识。
-
hasAnyAuthority,对应 public final boolean hasAnyAuthority(String... authorities) 方法,含义同 hasAnyRole,不同点在于这是权限,而不是角色,区别就在于权限往往带有前缀(如默认的ROLE_),而角色只有标识
-
permitAll,对应 public final boolean permitAll() 方法,含义为允许所有人(可无任何权限)访问。
-
denyAll,对应 public final boolean denyAll() 方法,含义为不允许任何(即使有最大权限)访问。
-
isAnonymous,对应 public final boolean isAnonymous() 方法,含义为可匿名(不登录)访问。
-
isAuthenticated,对应 public final boolean isAuthenticated() 方法,含义为身份证认证后访问。
-
isRememberMe,对应 public final boolean isRememberMe() 方法,含义为记住我用户操作访问。
-
isFullyAuthenticated,对应 public final boolean isFullyAuthenticated() 方法,含义为非匿名且非记住我用户允许访问。
设计者可选取适当的控制方式和级别进行控制,也可以事先定义好角色、权限等权限体系,供开发者使用。
接下来,启动系统,访问一下用户首页,看一下系统作何反应。
果不其然,系统跳转到了403无权限页面(由于我们没有默认的403页面,也没有自定义403错误页面,所以系统展示报错信息页面)。于此同时,控制台也报了不允许访问的错误。
下面我们在配置文件中,给默认用户添加角色:User。
spring:
security:
user:
name: zhangsan
password: 123456
roles:
- User
再次启动系统,刷新一下页面,登录后,成功显示了用户个人中心页面。
至此,用注解实现权限控制完成。
其它详细源码,请参考文末源码链接,可自行下载后阅读。
源码
github
https://github.com/liuminglei/SpringSecurityLearning/tree/master/12
gitee
https://gitee.com/xbd521/SpringSecurityLearning/tree/master/12
回复以下关键字,获取更多资源
SpringCloud进阶之路 | Java 基础 | 微服务 | JAVA WEB | JAVA 进阶 | JAVA 面试 | MK 精讲
笔者开通了个人微信公众号【银河架构师】,分享工作、生活过程中的心得体会,填坑指南,技术感悟等内容,会比博客提前更新,欢迎订阅。
推荐阅读
-
史上最简单的Spring Security教程(十一):url区分不同的登录失败场景
-
史上最简单的 Spring 教程 | 第四篇:基于注解的IOC配置
-
史上最简单的Spring Security教程(二十):AccessDecisionVoter必须全部拥有请求所需权限才可访问
-
史上最简单的Spring Security教程(四十):SecurityContextPersistenceFilter详解
-
史上最简单的Spring Security教程(十三):动态用户
-
史上最简单的Spring Security教程(十四):动态权限(自定义UserDetailsService)
-
史上最简单的Spring Security教程(十九):AccessDecisionVoter简介及自定义访问权限投票器
-
史上最简单的Spring Security教程(十五):资源权限动态控制(FilterSecurityInterceptor)
-
史上最简单的Spring Security教程(二十七):AuthenticationManager默认实现之ProviderManager详解
-
史上最简单的Spring Security教程(二十二):自定义AccessDecisionManager实现简单的访问决策