4.权限管理模块开发
4.1 权限管理概述
4.1.1 权限管理的意义
后台管理系统中,通常需要控制不同的登录用户可以操作的内容。权限管理用于管理系统资源,分配用户菜单、资源权限,以及验证用户是否有访问资源权限。
4.1.2 RBAC权限设计模型
ACL介绍
ACL(Access Control List):访问控制列表 用户 -> 权限
ACL 模型,权限能直接赋予用户,例如将查看订单列表(权限)赋予某位运营人员(用户)。但是这种模式的缺点在于,但用户量达到一定量级的时候,那么就需要对每个用户都进行一次授权操作,那么这个工作量就会相当大。
RBAC介绍 (Role-Based Access Control,基于角色的访问控制)
RBAC 模型,这是软件设计中最常用的权限管理模型,相比于 ACL 模型,RBAC 模型在用户与权限之间多了一个元素「角色」,通过权限关联角色、角色关联用户的方法来间接地赋予用户权限,从而实现用户与权限的解耦。
使用ACL模式时,当系统中存在多个用户拥有相同的权限,在分配的时候就要分别为这几个用户指定相同的权限,修改时也要为这几个用户的权限进行一一修改。
使用RBAC模式 有了角色后,我们只需要为该角色制定好权限后,将相同权限的用户都指定为同一个角色即可,便于权限管理。
4.1.3 权限管理相关概念
4.1.3.1 用户管理
用户管理中的用户主要是功能系统的使用者,这些用户是一个一个的员工个体,这些个体往往从两个维度来进行划分:行政关系(部门架构)、业务部门(业务架构)。
用户管理就是在此两个维度来给员工个体进行关联性的初步分群或者分组。按照行政部门或者按照业务线部门划分后,对应部门或者小组内的用户有着基本相似的系统功能使用需求和权限等级;
4.1.3.2 权限管理
1) 功能权限管理
功能权限管理:指的是用户可看到哪些模块,能操作哪些按钮,因为企业中的用户拥有不同的角色,拥有的职责也是不同的。
菜单级别的权限控制
操作按钮级别的权限控制
- 在菜单级权限控制的基础上,将页面上的操作动作也一并管理维护,即页面上的操作按钮,简单说就是增、删、改、查等操作的统一授权管理,此种管理模式,可将权限控制得更加细致、准确。
2) 数据权限管理
数据权限管理:指的是用户可看到哪些模块的哪些数据。
例如:一个系统中包含多个清单(清单 1、清单 2、清单 3),系统管理员能对整个系统操作维护,也就可以对系统中的所有清单进行操作(增、删、改、查);
假如分配给二级管理员的是清单 1,那么他将只能对清单 1 进行操作(增、改、查);
如果是普通用户也许只有查看数据的权限,没有数据维操作的权限(查),这里的操作是指系统中所有可点击的按钮权限操作,列举的增删改查只是最常见的几种操作而已。
4.1.3.3 角色管理
角色往往是基于业务管理需求而预先在系统中设定好的固定标签,每个角色对应明确的系统权限,其所拥有的系统权限一般不会随意更改,并且角色也不会随着用户的被添加和被移除而进行改变,相较于用户管理而言更加稳定;
1) 角色是资源或菜单权限的集合。通过角色对不同管理员分配不同的资源、菜单权限。拥有相同权限的用户可以访问相同的菜单和资源。可以理解为权限分组。
2) 通过对用户分配角色,来最终实现用户的访问权限控制。一个用户可分配多个角色,这些角色的资源、菜单的并集即是用户可访问的全部资源。
4.1.4 权限管理设计
4.1.4.1 权限关系图
权限管理包含用户、角色、菜单、三个个核心组件。通过建立这些组件之间的关联关系,来实现用户到菜单的权限控制。
权限管理组件的关系图:
4.1.4.2 权限数据库设计
4.2 Spring Security实战
4.2.1 Spring Security 简介
1) Spring Security 是 Spring 家族中的一个安全管理框架,可以轻松地与 Spring 应用程序集成, 它提供了一系列的安全服务和工具,用于保护企业应用程序的安全性。
Spring Security 提供了许多功能,包括身份验证(Authentication)、授权(Authorization)、访问控制、密码管理、单点登录(Single Sign-On)、攻击防范(如跨站点脚本攻击、SQL注入攻击)等。
2) 认证和授权也是SpringSecurity作为安全框架的核心功能
-
认证(Authentication):验证用户的身份以确保用户是合法的,可以访问系统中的资源。
这通常涉及用户身份验证,例如使用用户名和密码验证用户的身份,或者使用第三方身份验证提供程序进行身份验证,例如 OAuth2。
-
授权(Authorization):控制用户对系统中资源的访问权限。这涉及将用户分配到特定的角色或权限,以控制他们可以执行哪些操作和访问哪些资源。
例如,管理员可能有更多的权限,可以访问和修改系统的高级设置,而普通用户则只能访问他们自己的个人资料信息。
3) Spring Security 与 Shiro的区别?
- 领域不同:Spring Security 是 Spring 生态系统的一部分,而 Shiro 是一个独立的框架。
- 功能不同:Spring Security 提供了更完整的安全性解决方案,包括基于过滤器链的身份验证、授权、会话管理、密码管理、单点登录等功能。Shiro 更注重简化开发人员的安全需求,提供易于使用和灵活的 API。
- 灵活性不同:Shiro 在配置和使用方面更加简单,提供了灵活性和易于集成性。相比之下,Spring Security 提供了更高级的功能,但需要更多的配置和学习成本。
一般来说中大型的项目都是使用SpringSecurity 来做安全框架。小项目有Shiro的比较多,因为相比与SpringSecurity,Shiro的上手更加的简单。
4.2.2 Spring Security 快速入门
4.2.2.1 创建SpringBoot工程
1) 创建工程
2) 引入依赖
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.8</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.xxx</groupId><artifactId>springsecurity_example</artifactId><version>0.0.1-SNAPSHOT</version><properties><java.version>11</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
4.2.2.2 入门案例编写
- 启动类
@SpringBootApplicationpublic class SpringsecurityExampleApplication {public static void main(String[] args) {SpringApplication.run(SpringsecurityExampleApplication.class, args);}}
- Controller
@RestControllerpublic class HelloController {@RequestMapping("/hello")public String hello(){return "hello";}}
- 引入SpringSecurity依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>
- 登录页面
访问http://localhost:8080/hello 会跳转到 http://localhost:8080/login
用户名是 user, 密码会打印到控制台
Using generated security password: ac3218c5-3abe-4ac7-bade-3d6487b38bf3
退出登录
4.2.2.3 SpringSecurity工作流程分析
SpringSecurity的原理其实就是一个过滤器链,内部包含了提供各种功能的过滤器。这里我们可以看看入门案例中的过滤器。
图中只展示了核心过滤器,其它的非核心过滤器并没有在图中展示。
- UsernamePasswordAuthenticationFilter: 负责处理我们在登陆页面填写了用户名密码后的登陆请求。入门案例的认证工作主要有它负责。
- ExceptionTranslationFilter:处理过滤器链中抛出的任何AccessDeniedException和AuthenticationException 。
- FilterSecurityInterceptor:负责权限校验的过滤器。
Debug分析
- 添加断点
- 获取容器中的Bean