跳至主要內容

08 增加权限控制

Java突击队大约 3 分钟

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,发现已经访问不了了,跳转到了一个登录页面:open in new window

说明权限功能生效了。

目前是使用系统默认的权限控制,我们需要按照我们的想法自定义权限控制,该怎么办呢?

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,调用用户查询接口。open in new window

此时浏览器跳转到一个登录页面:

我们需要一个账号能够登录成功。

为了测试起来更加方便,我们需要增加一个用于做权限测试的账号。

在mall-mgt的application.yml配置文件中增加如下配置:

spring
  security:
     user:
       name: susan
       password: 123456
     roles:
       User

增加一个用户名是:susan,密码是:123456的账号,角色名是User。

然后重启项目。

发现登录成功了:

但是访问接口时出现了服务器内部错误。

查看日志是下面的原因:

这就涉及到一个比较麻烦的问题,下一篇文章会处理这个问题,并引入JWT。