鉴权实现(一)

100 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 9 天,点击查看活动详情

每日英语:

Once you label me,you negate me.

一旦你给我贴上标签,你就否定了我。 -索伦·克尔凯郭尔

鉴权实现

昨天我们虽然实现了身份认证功能,但还存在权限问题,并不是所有链接地址都需要用户登录,而且用户登录后并不是所有地址都能访问,因此涉及到权限校验的问题。

我们前面分析过permission表,里面所有的url其实就是需要权限校验的地址,用户请求一个地址,如果在该表中不存在,则表示该地址不需要权限校验。

如果需要权限校验,就需要判断当前用户的角色是否包含该权限路径了。

鉴权服务搭建

1)Api

创建mall-permission-api并将提前生成好的JavaBean拷贝到工程中:

com.xz.mall.permission.model.Permission:

@Data
@AllArgsConstructor
@NoArgsConstructor
//MyBatisPlus表映射注解
@TableName(value = "permission")
public class Permission implements Serializable {
​
   @TableId(type = IdType.AUTO)
    private Integer id;
    private String sourceName;
    private String url;
    private Integer urlMatch;
    private String serviceName;
    private String method;
}

com.xz.mall.permission.model.RoleInfo:

@Data
@AllArgsConstructor
@NoArgsConstructor
//MyBatisPlus表映射注解
@TableName(value = "role_info")
public class RoleInfo implements Serializable {
​
    @TableId(type = IdType.AUTO)
    private Integer id;
    private String roleName;
    private String description;
    //权限列表
    @TableField(exist = false)
    private List<Permission> permissions;
}

2)Service

创建mall-permission-service工程

pom.xml依赖如下:

<dependencies>
    <dependency>
        <groupId>com.xz</groupId>
        <artifactId>mall-permission-api</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
</dependencies>

创建核心配置文件bootstrap.yml

server:
  port: 8094
spring:
  application:
    name: mall-permission
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://192.168.xxx.xxx:3306/shop_permission?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    username: root
    password: 123456
  cloud:
    nacos:
      config:
        file-extension: yaml
        server-addr: 192.168.xxx.xxx:8848
      discovery:
        #Nacos的注册地址
        server-addr: 192.168.xxx.xxx:8848
  redis:
    host: 192.168.xxx.xxx
    port: 6379
# ====================MybatisPlus====================
mybatis-plus:
  mapper-locations: mapper/*.xml
  type-aliases-package: com.xz.mall.*.model
  configuration:
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

#日志配置
logging:
  pattern:
    console: "%msg%n"

创建启动类com.xz.mall.PermissionApplication

@SpringBootApplication
public class PermissionApplication {
​
    public static void main(String[] args) {
        SpringApplication.run(PermissionApplication.class,args);
    }
}

3)对象创建

Dao、Service、Controller可以直接使用MyBatisPlus代码生成器生成。

鉴权执行流程分析

1612678105327.png

鉴权流程如上图:

1:程序启动,初始化加载角色对应的权限,并存入到Redis缓存
2:用户登录的时候,如果登录成功,将用户信息封装到JWT令牌,令牌中包含用户角色ID
3:用户访问后端服务,在微服务网关处对权限进行校验,如果权限校验通过,则允许访问,否则不允许访问

流程看起来很简单,但是要注意的细节很多,比如有些地址是不需要权限访问的,比如登录、注册,令牌有可能会被别人修改,修改后把角色修改成权限很多的角色,对系统是会造成数据安全隐患,这些问题我们都需要一个一个解决。

总结

本篇主要下了一下鉴权服务工程的搭建,还有鉴权执行流程分析。下一篇我会介绍一下权限校验代码逻辑的具体实现。