springboot 实现权限管理(一)
一、背景
1、 为什么进行权限管理? 生活在形形色色的世界之中,我们各自扮演着各自的角色,拥有不同的权利和义务。映射在计算机系统之中,也一样需要 角色、权限 来进行对用户的分类,限制访问资源,保证资源地合理被使用,使人各司其职。 2、应用场景 假设 管理员可以对用户进行CRUD的管理,而普通用户往往只拥有对资源的查看,无法进行删除等高级权限。 3、SpringBoot实现主要的方式 (1)采用注解+拦截器 (2)Shiro框架 (3)Spring Security 4、重点理解 (1)理解用户、角色、权限的概念 (2)分类资源(对应相应的权限),一般可以有数据权限、操作权限、访问权限等,表现为对URL(URI)的访问控制;URL即标识了访问数据,图片等。 (3)将用户,角色,权限 在库表设计时的五张表理解。在关系数据库中,由于原子性(第一规范),因此需要两张关联表进行管理用户和角色,角色和权限。
二、实现
- 实现逻辑:采用自底向上的思维
- 设计库表
create table crm.cus_user
(
id int auto_increment
primary key,
username varchar(50) not null,
password varchar(255) not null,
name varchar(31) null,
sex varchar(2) null,
phone varchar(11) null,
address varchar(255) null,
dept_id varchar(100) null,
create_time timestamp null
)
comment 用户表;
create table crm.cus_role
(
id int auto_increment
primary key,
name varchar(255) null,
create_time timestamp null,
create_user_id int null,
update_time timestamp null,
update_user_id timestamp null
)
comment 用户角色表;
create table crm.cus_permission
(
id int auto_increment
primary key,
name varchar(255) null,
pid int null,
level int null,
mark varchar(255) null
)
comment 用户权限表;
create table crm.role_permission
(
id int auto_increment
primary key,
role_id int null,
permission int null
)
comment 角色权限关联表;
create table crm.user_role
(
id int auto_increment
primary key,
user_id int null,
role_id int null
)
comment 用户权限关联表;
- 处理逻辑分析
(1)用户访问非登录URL,则查看token(存储在header);若token失效则返回失效,token未失效进行权限查看(token及权限信息等常用个人信息采用Redis进行缓存),有权限放行,无权限拦截; (2)用户访问登录URL,则无需拦截,判断用户、密码,进行缓存个人信息(查询关系数据库的用户角色、权限信息后进行缓存),并返回token给用户作为下次登录凭证;
- 具体代码
(1)工程结构: 按照 MVC的工程结构:分为 controller,service,dao; controller:暴露访问资源的URL,使用注解进行注解需要权限的class或method; service:实现登录逻辑,登录验证,保存token。 dao:访问数据库(采用JPA) interceptor:进行拦截处理 (2)Postman进行测试 (3)关于Token的生成 在此简单采用的Md5简单加密,好处是简单,坏处是token不具动态性;采用采用策略模式进行设计不同的加密方式(JWT,等)
代码:见Gitee 三、项目地址
