开启掘金成长之旅!这是我参与「掘金日新计划 · 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代码生成器生成。
鉴权执行流程分析
鉴权流程如上图:
1:程序启动,初始化加载角色对应的权限,并存入到Redis缓存
2:用户登录的时候,如果登录成功,将用户信息封装到JWT令牌,令牌中包含用户角色ID
3:用户访问后端服务,在微服务网关处对权限进行校验,如果权限校验通过,则允许访问,否则不允许访问
流程看起来很简单,但是要注意的细节很多,比如有些地址是不需要权限访问的,比如登录、注册,令牌有可能会被别人修改,修改后把角色修改成权限很多的角色,对系统是会造成数据安全隐患,这些问题我们都需要一个一个解决。
总结
本篇主要下了一下鉴权服务工程的搭建,还有鉴权执行流程分析。下一篇我会介绍一下权限校验代码逻辑的具体实现。