Shiro 权限框架
1.简介
Apache Shiro是Java的一个安全框架。目前,使用Shiro的人越来越多,因为它相当简单,对比SPring Security,可能没有SPring Security做的功能强大,但是在很多项目的实际开发中可能并不需要那么复杂的东西,所以使用小而简单的Shiro就足够了。
Shiro可以非常容易的开发出足够好的应用 ,其不仅可以用在JavaSE环境,也可以用在JavaEE环境。Shiro可以帮助我们完成:认证、授权、加密、会话管理、与Web集成、缓存邓,是一个比较完备的安全框架,而且Shiro的API也非常简单。其简单功能点如下图所示:
2.术语和Shiro概念模型
关与软件的安全,首先有如下几个概念需要理解和区分:
Authentication:认证/登陆,检查用户是否有相应的身份。
Authorization:授权 ,既权限验证,验证某个以认证的用户是否拥有某个权限,判断用户是否能做事情,常见的如:验证某个用户是否拥有某个角色。或者细粒度的验证某个用户对某个资源是否具有某个权限。
Session Manager:会话管理,既用户登陆后就是一次会话,在没有推出之前,它的所有信息都在会话中;会话可以是普通javaSE环境的,也可以是如Web环境的。
从应用程序的角度来看,Shiro框架的工作方式为:
可以看到:应用代码直接交互的对象Subject,也就是Shiro框架的对外API核心就是Subject。其每个API的含义:
Subject:主体,代表了当前“用户”,这个用户不一定是一个具体的人,与当前应用交互的任何东西都是Subject,如网络爬虫,机器人等;既一个抽象概念;所有Subject都绑定到SecurityManager
,与Subject的所有交互都会委托给SecurityManager;可以把Subject以为是是一个门面;SSecurityManager才是实际的执行者;
SecurityManager:安全管理器;既所有与安全有关的操作都会与SecurityManager交互;而且它管理着所有Subject;可以看出它是Shiro的核心,它负责与后边介绍的其他醉驾案进行交互,如果学习过SpringMVC,你可以把它看成DispatcherServlet前端控制器;
Realm:域,Shiro从Realm获取安全数据(如用户、角色、权限),就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户数据进行比较以确认用户是否能进行操作。因此,可以通俗地把Realm看成DataSource既安全数据源。Realm的实现方式可以有很多种,比如JDBC、ini文件、LDAP或者内存实现。
归纳起来,对于我们而言,最简单的一个Shiro应用,上述几个对象的分工大概是:应用代码通过Subject来进行认证和授权,而Subject又委托给SecurityManager;开发者需要给Shiro的SecurityManager注入Realm,从而让SecurityManager得到合法的用户及其权限进行判断。从以上也可以出,Shiro不提供维护用户/权限,而是通过Realm让开发者自己注入。
除上述几个概念,Shiro还有几个重要的对象需要了解。
Authenticator:认证器,负责主体认证的,这是一个扩展点,如果用户觉得Shiro默认的不好,可以自定义实现;其需要认证策略(Authentication Strategy),既什么情况下算用户认证通过了。
Authrizer:授权器,或者访问控制器,用来决定主体是否有权限进行相应的操作;既控制着用户能访问应用中的哪些功能。
CacheManager:缓存控制器 ,来管理如用户、角色、权限等的缓存的;因为这些数据基本上很少去改变,放到缓存后可以提高访问的性能。
**Cryptography:**密码模块,Shiro提供了一些常见的加密组件应用于如密码加密/解密。
3.Shiro的实操
3.1整体架构
3.2SpringBoot和thymeleaf模板技术引入Shiro核心依赖
3.3Spring框架融合Shiro安全框架用的全部jar包
3.4在Pojo包中创建Uesr实体对象与数据库一致
Pojo包中的实体对象
数据库中的表结构
3.5Dao与Service类
Dao
Service
3.6Controller控制器类
登录LoginController
3.7自定义Realm(域)
3.8自定义Config
3.9HTML页面