shiro
为什么要用shiro
项目中的密码是否可以明文存储?
是否任意访客,无论是否登录都可以访问任何功能?
项目中的各种功能操作,是否所有用户都可以随意使用?
综上,当项目中的某些功能被使用时,需要进行安全校验,进而保证整个系统的运行秩序
在java世界中,安全管理框架有spring security 和shiro 。spring security 要依赖于spring,并且比较复杂,学习曲线比较高。shiro比较简单,而且shiro比较独立,既可以在java se中使用,也可以在java ee中使用,并且在分布式集群环境下也可以使用
shiro是一个基于java的开源的安全管理框架。可以完成认证,授权,会话管理,加密,缓存等功能。
一、Shiro架构
shiro运行流程中的3个核心的组件
Subject 、SecutiryManager 、Realm
shiro使用中,必须有的3个概念
1. Subject
安全校验中,最常见的问题是"当前用户是谁""当前用户是否有权做某事",所以考虑安全校验过程最自然的
方式就是基于当前用户。Subject代表了当前"用户"
应用代码直接交互的对象是"Subject" ,只要得到Subject对象马上可以做绝大多数的shiro操作
也就是说Shiro的对外API核心就是Subject
Subject会将所有交互都委托给SecurityManager
==Subject是安全管理中直接操作的对象==
2. SecurityManager
安全管理器,即所有与安全有关的操作都会与SecurityManager 交互
且其管理着所有Subject;它是Shiro的核心
它负责与Shiro的其他组件进行交互,它相当于SpringMVC中DispatcherServlet的角色
3. Realm
Shiro从Realm获取安全数据(如用户、角色、权限),就是说SecurityManager 要验证用户身份,那么
它需要从Realm获取相应的用户进行比较以确定用户身份是否合法;
也需要从Realm得到用户相应的角色/权限进行验证用户是否能进行操作
可以把Realm 看成Dao(数据访问入口)
二、RBAC模型
Role Base Access Controll 基于角色的访问控制
shiro采用的安全管理模型
模型中3个主体:用户、角色、权限
每个角色可以有很多个权限,每个权限可以分配给多个角色
每个用户可以有很多个用户,每个角色可以分配给多个用户
两个多对多
则权限访问控制,做的事是
-
身份校验:判断是否为合法用户
-
权限校验:用户要做某件事或使用某些资源,必须要拥有某角色,或必须拥有某权限
在访问控制过程中,是要对项目中的资源(功能,数据,页面元素等)的访问,使用进行安全管理
- 首先照旧记录用户信息
- 指定用户角色
如:学员,讲师,保洁员 - 对“资源”指定权限:即能对资源做的所有操作
如:“教室”,“进入教室”,“在教室学习”,就是该资源的两个权限 - 将权限分配给不同的角色
如:“进入教室”分配给“学员”,“讲师”,“保洁员”三种角色
在“教室学习”,分配给“学员”角色 - 将角色分配给具体用户
如:“莉莉”分配“学员”角色
“丽丽”分配“保洁员”角色
二、shiro架构基本了解(暂了解即可)
shiro的结构体系:
- Authentication:认证
验证用户是否合法,也就是登陆。 - Authorization:授权
授予谁具有访问某些资源的权限。 - session Management:会话管理
用户登陆后的用户信息通过session Management 来进行管理,不管是什么应用中 - Cryptography:加密
提供了常见的一些加密算法,使得在应用中可以很方便的实现数据安全,并且使用很便捷 - Web support: web应用程序支持
shiro 可以很方便的集成到web应用程序中 - Caching:缓存
shiro提供了对缓存的支持,支持多种缓存架构:如:ehcache还支持缓存数据库:如:redis - Concurrency: 并发支持
支持多线程并发访问 - Testing :测试
- Run As :
支持一个用户在允许的前提下使用另外一个身份登录 - Remember Me:记住我
shiro的架构
-
Subject主体,可以是用户,也可以是第三方程序等,subject用于获取主体信息,Principals和
Credentials -
Security Manager:安全管理器
安全管理器是shiro架构的核心。由其来协调管理shiro各个组件之间的工作。 -
Authenticator :认证器
负责验证用户的身份 -
Authorizer:授权器
负责为合法的用户指定其权限。控制用户可以访问那些资源 -
Realms:域
用于通过shiro来完成相关的安全工作,shiro是不会去维护数据信息的。在shiro的工作过程中,数据的查询和获取工作是通过Realm 从不同的数据源来获取的。Realm 可以获取数据库信息,文本信息等。在shiro中可以有一个realm也可以有多个。
内容详解:
Authentication:用户认证
- 验证用户是否合法
需要提交身份和凭证个shiro
principals 用户的身份信息,是Subject 的标识属性。能够唯一标识Subject。如电话号码,电子邮件,身份证号码等
Credentials 凭证 :密码。是只被subject知道的密码值。可以是密码,也可以是数字证书等。
Principals/Credentials 最常见的组合:用户/密码 。在shiro 中通常使用UsernamePassWordToken,来指定身份和凭证信息。 - 在shiro中用户认证流程:
- 代码实现:
- 新建java项目
- 导入shiro相关的jar包
- 表写shiro的数据文件–配置
- 编码测试
二、