文章目录
-
- 第三章权限控制
- 3.1. 认证和授权概念
- 3.2. 权限模块数据模型
- 3.3 RBAC权限模型扩展:
- 【小结】
- 3.3. Spring Security简介
- 【讲解】
- 【小结】
- 3.4. Spring Security入门案例
- 【目标】
- 【路径】
- 3.4.1. 工程搭建
- 3.4.2. 配置web.xml
- 3.4.3. 配置spring-security.xml
- 【小结】
- 3.5. Spring Security进阶
- 【路径】
- 【讲解】
- 3.5.1. 配置可匿名访问的资源
- 【路径】
- 3.5.2. 使用指定的登录页面
- 3.5.2.1. 注意1
- 3.5.3. 从数据库查询用户信息
- 3.5.4. 对密码进行加密
- 3.5.5. 配置多种校验规则(对页面)
- 3.5.6. 注解方式权限控制(对类)
- 3.5.7. 退出登录
- 【小结】
第三章权限控制
1:认证和授权的概念
• 认证:登录(用户名和密码)
• 授权:访问系统功能的权限
2:权限模块的数据模型
• 用户表
• 角色表
• 权限表
• 菜单表
3:表之间关系
• 用户和角色是多对多关系
• 角色和权限是多对多关系
• 权限和菜单是多对多关系
3.1. 认证和授权概念
前面我们已经完成了旅游后台管理系统的部分功能,例如自由行管理、跟团游管理、套餐管理、预约设置等。接下来我们需要思考2个问题:
问题1:在生产环境下我们如果不登录后台系统就可以完成这些功能操作吗?
答案显然是否定的,要操作这些功能必须首先登录到系统才可以。(用户登录系统–>认证)
问题2:是不是所有用户,只要登录成功就都可以操作所有功能呢?
答案是否定的,并不是所有的用户都可以操作这些功能。不同的用户可能拥有不同的权限,这就需要进行授权了。(用户登录之后,对每个用户进行授权,通过授权去访问系统中不同的功能–>授权)
认证:系统提供的用于识别用户身份的功能,通常提供用户名和密码进行登录其实就是在进行认证,认证的目的是让系统知道你是谁。
授权:用户认证成功后,需要为用户授权,其实就是指定当前用户可以操作哪些功能。
本章节就是要对后台系统进行权限控制,其本质就是对用户进行认证和授权。
3.2. 权限模块数据模型
前面已经分析了认证和授权的概念,要实现最终的权限控制,需要有一套表结构支撑:
用户表t_user、权限表t_permission、角色表t_role、用户角色关系表t_user_role、角色权限关系表t_role_permission、
RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联。简单地说,一个用户拥有若干角色,每一个角色拥有若干权限。这样,就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间,角色与权限之间,一般都是多对多的关系。(如下图)
我们把基于角色的权限控制叫做RBAC
角色是什么?可以理解为一定数量的权限的集合,权限的载体。
例如:一个论坛系统,“超级管理员”、“版主”都是角色。版主可管理版内的帖子、可管理版内的用户等,这些是权限。要给某个用户授予这些权限,不需要直接将权限授予用户,可将“版主”这个角色赋予该用户。
在应用系统中,权限表现成什么?对功能模块的操作,对上传文件的删改,菜单的访问,甚至页面上某个按钮、某个图片的可见性控制,都可属于权限的范畴。
接下来我们可以分析一下在认证和授权过程中分别会使用到哪些表:
认证过程:只需要用户表就可以了,在用户登录时可以查询用户表t_user进行校验,判断用户输入的用户名和密码是否正确。
授权过程:用户必须完成认证之后才可以进行授权,首先可以根据用户查询其角色t_role,再根据角色查询对应的权限t_permission以及资源(如:t_menu)。
3.3 RBAC权限模型扩展:
在应用系统中,权限表现成什么?对功能模块的操作,对上传文件的删改,菜单的访问,甚至页面上某个按钮、某个图片的可见性控制,都可属于权限的范畴。有些权限设计,会把功能操作作为一类,而把文件、菜单、页面元素等作为另一类,这样构成“用户-角色-权限-资源”的授权模型。而在做数据表建模时,可把功能操作和资源统一管理,也就是都直接与权限表进行关联,这样可能更具便捷性和易扩展性。如“T_MENU”表示菜单的访问权限、“T_ELEMENT”表示页面元素的可见性、“T_FILE”表示文件的修改权限、“T_OPERATION”表示功能模块的操作权限控制等。
以上模型作为基准模型,在实际的生产环境中可能会有变化,需要灵活掌握。
如:
建立角色组,对角色进行分类管理,但角色组不参与权限分配。
建立用户组,对用户进行层级,分类管理。便于新增用户进行授权。
建立用户和权限的多对多关联,实现ACL模型权限控制。
本项目中将角色和菜单直接进行关联,便于查询该用户角色下的菜单权限集合。
【小结】
- 认证和授权
• 认证: 提供账号和密码进行登录认证,系统知道你的身份
• 授权: 根据不同的身份,赋予不同的权限,不同的权限,可访问系统不同的功能 - RBAC权限模块数据模型(基于角色的权限控制)
• 用户表
• 角色表
• 权限表
• 菜单表 - 表之间关系
• 用户和角色是多对多关系
• 角色和权限是多对多关系
• 权限和菜单是多对多关系
3.3. Spring Security简介
【讲解】
Spring Security是 Spring提供的安全认证服务的框架。 使用Spring Security可以帮助我们来简化认证和授权的过程。
官网:https://spring.io/projects/spring-security/
中文官网:https://www.w3cschool.cn/springsecurity/
对应的maven坐标:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
常用的权限框架除了Spring Security,还有Apache的shiro框架。
【小结】
- SpringSecurity是Spring家族的一个安全框架, 简化我们开发里面的认证和授权过程
- SpringSecurity内部封装了Filter(只需要在web.xml容器中配置一个过滤器–代理过滤器,真实的过滤器在spring的容器中配置)
- 常见的安全框架
• Spring的 SpringSecurity
• Apache的Shiro http://shiro.apache.org/
3.4. Spring Security入门案例
【目标】
使用Spring Security进行控制: 网站(一些页面)需要登录才能访问(认证)
【路径】
- 创建Maven工程spring_security_demo导入坐标
- 配置 web.xml (前端控制器, SpringSecurity相关的过滤器)
- 创建 spring-security.xml(核心)
3.4.1. 工程搭建
创建maven工程,打包方式为war。
pom.xml
<packaging>war</packaging>
<properties>
<spring.version>5.0.5.RELEASE</spring.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<!-- 指定端口 -->
<port>85</port>
<!-- 请求路径 -->
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
内置提供 index.html 页面,内容为“登录成功”!!
3.4.2. 配置web.xml
【路径】
1:DelegatingFilterProxy用于整合第三方框架(代理过滤器,非真正的过滤器,真正的过滤器需要在spring的配置文件)
2:springmvc的核心控制器
在web.xml 中主要配置 SpringMVC 的 DispatcherServlet 和用于整合第三方框架的DelegatingFilterProxy代理过滤器,真正的过滤器在spring的配置文件,用于整合Spring Security。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<filter>