Apache Shiro框架
博客原文:链接
一、什么是Apache Shiro?
Apache Shiro是Java的一个安全框架。功能强大,使用简单的Java安全框架,它为开发人员提供一个直观而全面的认证,授权,加密及会话管理的解决方案。
实际上,Shiro的主要功能是管理应用程序中与安全相关的全部,同时尽可能支持多种实现方法。Shiro是建立在完善的接口驱动设计和面向对象原则之上的,支持各种自定义行为。Shiro提供的默认实现,使其能完成与其他安全框架同样的功能,这不也是我们一直努力想要得到的吗!
Apache Shiro相当简单,对比Spring Security,可能没有Spring Security做的功能强大,但是在实际工作时可能并不需要那么复杂的东西,所以使用小而简单的Shiro就足够了。对于它俩到底哪个好,这个不必纠结,能更简单的解决项目问题就好了。
二、Shiro可以操作什么
- 验证用户身份以验证其身份
- 对用户执行访问控制,例如:
- 确定是否为用户分配了特定的安全角色
- 确定是否允许用户做某事
- 即使在没有Web或EJB容器的情况下,也可以在任何环境中使用Session API。
- 在身份验证,访问控制或会话的生存期内对事件做出反应。
- 汇总1个或更多用户安全数据的数据源,并将其全部显示为单个复合用户“视图”。
- 启用单点登录(SSO)功能
- 启用“记住我”服务以进行用户关联,而无需登录
- Shiro尝试在所有应用程序环境中实现这些目标-从最简单的命令行应用程序到最大的企业应用程序,而不必强加对其他第三方框架,容器或应用程序服务器的依赖
三、Apache Shiro功能
Apache Shiro是具有许多功能的全面的应用程序安全框架,组织方式如下:
Shiro以Shiro开发团队所谓的**“应用程序安全性的四个基石”**为目标-身份验证,授权,会话管理和密码术:
- **身份验证(Authentication):**有时称为“登录”,这是证明用户是他们所说的身份的行为。
- **授权(Authorization):**访问控制的过程,即确定“谁”有权访问“什么”。
- **会话管理(SessionManagement):**即使在非Web或EJB应用程序中,也管理用户特定的会话。
- **密码术(Cryptography):**使用密码算法保持数据安全,同时仍易于使用。
在不同的应用程序环境中,还具有其他功能来支持和加强这些问题,尤其是:
- **Web支持:**Shiro的Web支持API可帮助轻松保护Web应用程序。
- **缓存:**缓存是Apache Shiro API的第一层公民,可确保安全操作保持快速有效。
- **并发性:**Apache Shiro的并发功能支持多线程应用程序。
- **测试:**测试支持可以帮助您编写单元测试和集成测试,并确保您的代码将按预期进行保护。
- **“运行方式”:**一种功能,允许用户采用其他用户的身份(如果允许),有时在管理方案中很有用。
- **“记住我”:**在整个会话中记住用户的身份,因此他们仅在必要时登录。
四、Shiro的架构
Shiro的架构主要有三个顶级概念Subject, SecurityManager
和Realms
。图中展示了这些组件间的交互,接下来详细介绍:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4qVuJghB-1614160535152)(D:\hsq\img\ShiroBasicArchitecture.png)]
-
Subject: 正如我们在教程里提到的,
Subject
实际上是安全领域里的“当前执行用户”。“User”通常意指人类,而Subject
却可以是一个人,或者是第三方服务,守护进程帐户,定时任务等等——可以是基本上任何正与软件交互的事物。Subject
的实例都会(也是必须)绑定一个SecurityManager
,对Subject
的操作会转为Subject与SecurityManager之间的交互。 -
SecurityManager:
SecurityManager
是Shiro架构的核心,像个“保护伞”一样协调内部组件运作。不过一旦SecurityManager配置完成,它就被放一边去了,通常开发人员只需要使用Subject
。稍后详细介绍
SecurityManager
,现在你需要知道的是,当使用Subject
进行各种操作时,在背后做苦力活的可是SecurityManager
,这一点在上面的图中有所体现。 -
Realms: Realms在Shiro和你的安全数据之间扮演“桥梁”或“连接器”的角色。当需要用到安全数据比如用户帐号来进行认证或授权时,Shiro会从应用配置的一个或多个Realms中来查找。
这个意义上Realm其实就是安全(操作)特有的DAO:它封装了数据源的细节,并在Shiro需要时提供相关数据。配置Shiro时,必须至少得有一个Realm以用于认证(和/或)授权。在
SecurityManager
中可以配置Realm,至少得有一个。Shiro自带一些开箱即用的Realms用于连接像是LDAP,关系数据库(JDBC),文本配置源(比如INI)以及属性文件等等这样的安全数据来源。如果默认的不能满足你的需要,你也可以自己实现一个Realm。
同其他内部组件一样,Realms由
SecurityManager
管理着如何获取数据并传给Subject
的实例。
Shiro的核心架构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8Ije8baP-1614160535156)(D:\hsq\img\ShiroArchitecture.png)]
**Subject:**主体,既可以代表用户,也可以代表程序(网络爬虫等),它需要访问系统,系统则需要对其进行认证和授权,可以看到主体可以是任何可以与应用交互的“用户”。
SecurityManager: 安全管理,用户请求Url,对应于一个Subject对象,由SecurityManager统一对Subject进行认证和授权(父)。
Authenricator: 认证器,主要对Subject进行认证,Subject的信息在shrio中是通过AuthenticationToken对象来储存,由AuthenricationStrategy进行验证管理.(子)。如果用户觉得Shiro默认的不好,可以自定义实现;其需要认证策略(Authentication Strategy),即什么情况下算用户认证通过了;
**Authorizer:**授权器,Subject认证后,由它来对其授予对应角色权限.(子)即控制着用户能访问应用中的哪些功能;
SessionManager: Shiro的session管理方式,Shiro提供了一个专门管理session的方式,通常的web程序中的session是HttpSession的对象,是由web容器来管理的.如果写过Servlet就应该知道Session的概念,Session呢需要有人去管理它的生命周期,这个组件就是SessionManager;而Shiro并不仅仅可以用在Web环境,也可以用在如普通的JavaSE环境、EJB等环境;所有呢,Shiro就抽象了一个自己的Session来管理主体与应用之间交互的数据;这样的话,比如我们在Web环境用,刚开始是一台Web服务器;接着又上了台EJB服务器;这时想把两台服务器的会话数据放到一个地方,这个时候就可以实现自己的分布式会话(如把数据放到Memcached服务器);
SessionDao: session的接口,Shiro通过它来管理session数据,个性化的session数据储存需要使用sessionDao.
CacheManager: 缓存控制器,主要对session数据和授权数据进行缓存,减小数据库的访问压力.可以通过和ehcache的整合对缓存数据进行管理.
Pluggable Realms: 可扩展领域,相当于数据源,我们通过上面内容可以大致了解到Shiro的工作原理,但Shiro是怎样得知Subject的信息和数据库的信息是否匹配呢?Shiro这里就提供了一个realms的概念,它的作用就是得到数据库中的信息.这个realm是可以多个并且可以自定义,只需继承AuthorizingRealm这个接口就可以了.可以有1个或多个Realm,可以认为是安全实体数据源,即用于获取安全实体的;可以是JDBC实现,也可以是LDAP实现,或者内存实现等等,由用户提供,Shiro不知道你的用户/权限存储在哪及以何种格式存储,所以我们一般在应用中都需要实现自己的Realm密码模块
注意:对Subject进行认证和授权都需要调用realm,所以realm不仅仅相当于数据源,更加包含了认证和授权的一种逻辑.
Cryptography: 密码模块,一个密码管理工具,提供了一套加密/解密的组件.比如常用的散列,加/解密等功能,日常练习所使用的md5算法其实是一种散列算法,只能加密,不能解密.
Shiro处理认证流程图
可见,Shiro处理流程是一级一级的调用,主要是调用Authentication来进行验证,最后还是需要使用realm来进行身份验证。
五、过滤器权限拦截器
过滤器简称 | 对应的java类 |
---|---|
anon | org.apache.shiro.web.filter.authc.AnonymousFilter |
authc | org.apache.shiro.web.filter.authc.FormAuthenticationFilter |
authcBasic | org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter |
perms | org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter |
port | org.apache.shiro.web.filter.authz.PortFilter |
rest | org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter |
roles | org.apache.shiro.web.filter.authz.RolesAuthorizationFilter |
ssl | org.apache.shiro.web.filter.authz.SslFilter |
user | org.apache.shiro.web.filter.authc.UserFilter |
logout | org.apache.shiro.web.filter.authc.LogoutFilter |
六、JSP shiro标签
权限基础
ITeye论坛关于权限控制的讨论
RBAC新解
其他相关文章
Shiro官方文档
Shiro官方推荐资料
Shiro参考手册中文版
简单shiro扩展实现NOT、AND、OR权限验证
集成Shiro后当遇到404错误时会丢失session
在velocity 模板文件中,实现 shiro 权限验证
七、Shiro
使用Shiro框架分析的流程图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yhyT3Cel-1614160535162)(D:\hsq\img\shiro流程分析图.jpg)]
配置用户名和密码的注意
用户名保证唯一性:验证用户名是否唯一和是否占用
密码入库要用暗文
package microservice.fpzj.core.util;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.apache.shiro.util.ByteSource;
public class PasswordUtil {
private String algorithmName = "md5"; //指定散列算法为MD5,还有别的算法如:SHA256、SHA1、SHA512
private int hashIterations = 2; //散列迭代次数 md5(md5(pwd)): new Md5Hash(pwd, salt, 2).toString()
public void setAlgorithmName(String algorithmName) {
this.algorithmName = algorithmName;
}
public void setHashIterations(int hashIterations) {
this.hashIterations = hashIterations;
}
//加密:输入明文得到密文
public String encodePassword(String pwd, String salt) {
//user.setSalt(randomNumberGenerator.nextBytes().toHex());
String newPassword = new SimpleHash(
algorithmName,
pwd,
ByteSource.Util.bytes(salt),
hashIterations).toHex();
return newPassword;
}
public boolean verifyPassword(String targetPassword, String pwd, String salt){
String newPassword = this.encodePassword(targetPassword, salt);
if(newPassword.equals(pwd)){
return true;
}else{
return false;
}
}
}
案例:ssm+shiro
博客文章:https://www.cnblogs.com/kitor/p/11281629.html
springboot+shiro
博客文章:https://blog.csdn.net/wohaqiyi/article/details/79338439
ssm整合shiro单点登录: https://blog.csdn.net/m0_37797991/article/details/78529096
springBoot整合shiro单点登录:https://blog.csdn.net/liuchuanhong1/article/details/76850181
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/121439.html