一、概述
1、什么是权限管理?
答: 实现对用户访问系统的控制,用户只能访问自己被授权的资源。只要有用户名和密码的系统,权限管理都会出现。
举个例子: 答:给张三赋予 “人力资源经理”角色,该角色就具有“查询员工”,“添加员工”,“修改员工”,“删除员工”的权限。此时张三进入系统后,就有这些操作权限。
2 、shiro概述
- Apache Shiro是Java的一个安全框架
- 强大、小、简单易用,主要用来:便捷的认证、授权、加密、会话管理、与WEB集成、缓存等
- Spring中的Spring Security也是一个权限框架,但是它和Spring的依赖过于紧密,是个重量级框架,没有Shior使用简单。
- 而Shior不依赖于Spring,不仅可以用于 web,还可以用于C/S系统,分布式系统权限管理。
2 、shiro整体架构/架构流程
- 整体架构:
- ①用户(Subject)发送请求到安全管理器(Security Manager)
- ②安全管理器调用认证器组件(Authenticator)进行认证
- ③认证需要的比对数据(token与数据库中的数据)通过Realm来获取。
二、Shior核心概念
1、核心类
- Authentication:身份认证/登陆,验证用户是不是拥有相应的身份(角色)。(判断用户名密码是否匹配的登陆过程)
- Authorization:授权,即:权限认证,验证某个已认证的用户是否拥有某个权限。
- Session Manager:会话管理。用户登陆后就是建立了一次会话,在退出之前,所有的信息都在会话当中。
2、主要概念
- Subject:代表正在操作系统的客户
- SecurityManager:安全管理器,相当于SpringMVC中的DispatcherServlet。校验用户是否合法。
- Realms:提供从数据库取出来的用户名 和 密码。
- token: 中保存了用户输入的账号和密码。
三、Shiro的使用(认证 和 授权)
0、创建Maven项目(quick start)
1、Shiro需要的jar包
<dependency>《!--Shiro jar--》
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>《!--引入日志jar--》
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency><!--日志依赖的jar : slf4j-nop-->
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.25</version>
<scope>test</scope>
</dependency>
2、Shiro认证流程代码分析
3、Shiro认证流程:(匹配账号密码来进行登陆验证)
- 1、构造一个SecurityManager环境。
- 2、主体(用户)提交认证subject.login(token)给安全管理器(SecurityManager) 。。。。。 //subject.login(token)的方法内部会把token提交给安全管理器去做认证(即:调用securityManager.login(token))。
- 3、安全管理器 调用认证器组件(Authenticator)执行真正的认证。
认证的流程
认证的流程: 用户发送认证请求到安全管理器,安全管理器调用认证器组件进行认证。
如何认证? 安全管理器在调用 认证器组件认证之前,要调用realm进行数据库查询 判断是否有该用户。没有的话,直接返回认证信息info为null,就不再调用认证器组件了。若该用户存在的话,则再调用认证器组件进行认证。
匹配原则?
- 先匹配账号是否存在,若账号不存在返回info==null;若账号存在(即:info != null),再交给一个认证器接着再验证密码是否匹配。
认证流程图
4、自定义Realm(在Realm中做登陆的认证)
当用户真实的账号密码没有保存在.ini文件中,而是要从数据库中进行读取获得时,我们就需要自定义Realm来进行认证的验证。
5、散列密码
- 1)概述:一般用于对数据加密,加密结果为:一串长字符。是一种不可逆的算法。一般适用于存储密码之类的数据,常见的散列算法如:MD5、SHA等。
- 不可逆:(明文转换成密文之后,就没有办法再转成明文了)
- 很多的MD5解密网站,实质就是 根据你输入的密文 去数据库查询 对应的明文。
- 同一个字符串,每次加密的结果是一样的。
- 数据库中存的是加密后的密文。用户输入的密码,系统会进行加密后再与数据库中密文比较。
- 为了加密的数据 更加的安全,我们需要“加盐” + “多次散列”。
- 2)为了实现用户让输入的明文密码自动的(按照我的加密规则)进行MD5加密,加密后与数据库的密文进行比对。我们要做一些配置才能达到这样的目的。
6、授权
- 0)权限格式的定义:
资源:权限,资源:权限
user:create,user:update
- 1)方式一:用户的权限信息写在了**.ini文件中**(实际开发是写在数据库中的)
.ini配置文件
具体的操作:
- 2)方式二:在自定义realm中操作