08 增加权限控制
08 增加权限控制
前言
通过前面几篇文章的介绍,已经将权限模块相关的基础CRUD,包括接口的返回和异常都统一封装了一下。
今天这篇文章开始增加权限控制的功能,希望对你会有所帮助。
1 增加spring-security依赖
目前市面上主流的权限框架是:spring-security和shiro,shrio使用起来更简单,而spring-security的功能更强大。
苏三商城项目选择的权限框架是:spring-security。
首先要加入spring-security的相关依赖包。
在mall-mgt项目的pom.xml文件中增加如下依赖:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
</dependency>
刷新maven之后,重新启动项目。
访问之前的swagger地址:http://localhost:8011/swagger-ui/index.html,发现已经访问不了了,跳转到了一个登录页面:
说明权限功能生效了。
目前是使用系统默认的权限控制,我们需要按照我们的想法自定义权限控制,该怎么办呢?
2 开启全局方法权限控制
首先需要开启全局方法权限控制。
增加一个SpringSecurityConfig类:
@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SpringSecurityConfig {
}
在上面增加@Configuration、@EnableWebSecurity和@EnableGlobalMethodSecurity三个注解。
3 使用@PreAuthorize注解
接下来,我们需要对接口做权限验证。
在spring-security中已经给我们封装了一个@PreAuthorize
注解,我们只需要使用该注解就可以进行权限验证。
@PreAuthorize
注解的value是Spring-EL表达式类型的字符串,它的值可以包含下面几种方法。
hasRole
:含义为必须含有某角色(非ROLE_开头),如有多个的话,必须同时具有这些角色,才可访问对应资源。hasAnyRole
:含义为只具有某一角色(多个角色的话,具有任意一个即可),即可访问对应资源。hasAuthority
: 含义同 hasRole,不同点在于这是权限,而不是角色,区别就在于权限往往带有前缀(如默认的ROLE_),而角色只有标识。hasAnyAuthority
:含义同 hasAnyRole,不同点在于这是权限,而不是角色,区别就在于权限往往带有前缀(如默认的ROLE_),而角色只有标识。permitAll
:含义为允许所有人(可无任何权限)访问。denyAll
:含义为不允许任何(即使有最大权限)访问。isAnonymous
:含义为可匿名(不登录)访问。isAuthenticated
:含义为身份证认证后访问。isRememberMe
:含义为记住我用户操作访问。isFullyAuthenticated
:含义为非匿名且非记住我用户允许访问。
在用户查询接口上增加@PreAuthorize
注解,使用hasRole方法:
/**
* 通过id查询用户信息
*
* @param id 系统ID
* @return 用户信息
*/
@PreAuthorize("hasRole('User')")
@ApiOperation(notes = "通过id查询用户信息", value = "通过id查询用户信息")
@GetMapping("/findById")
public UserEntity findById(Long id) {
return userService.findById(id);
}
其中设置的角色为User。
4 增加权限账号配置
我们此时在浏览器地址栏输入:http://localhost:8011/v1/user/findById?id=1,调用用户查询接口。
此时浏览器跳转到一个登录页面:
我们需要一个账号能够登录成功。
为了测试起来更加方便,我们需要增加一个用于做权限测试的账号。
在mall-mgt的application.yml配置文件中增加如下配置:
spring
security:
user:
name: susan
password: 123456
roles:
User
增加一个用户名是:susan,密码是:123456的账号,角色名是User。
然后重启项目。
发现登录成功了:
但是访问接口时出现了服务器内部错误。
查看日志是下面的原因:
这就涉及到一个比较麻烦的问题,下一篇文章会处理这个问题,并引入JWT。