shiro 安全框架入门,看这一篇就够了

序言大家好,我是老马 。
前面我们学习了 5 分钟入门 shiro 安全框架实战笔记,让大家对 shiro 有了一个最基本的认识 。
shiro 还有其他优秀的特性,今天我们就一起来学习一下,为后续深入学习奠定基础 。
Apache Shiro 是什么?Apache Shiro 是一种功能强大且易于使用的JAVA安全框架,它执行身份验证,授权,加密和会话管理,可用于保护任何应用程序的安全-从命令行应用程序,移动应用程序到最大的Web和企业应用程序 。
shiro 的组件结构如下图:

shiro 安全框架入门,看这一篇就够了

文章插图
 
components
Shiro提供了应用程序安全性API来执行以下方面(我喜欢将它们称为应用程序安全性的4个基石):
  • 身份验证-证明用户身份,通常称为用户“登录” 。
  • 授权-访问控制
  • 密码学-保护或隐藏数据以防窥视
  • 会话管理-每个用户的时间敏感状态
Shiro还支持一些辅助功能,例如Web应用程序安全性,单元测试和多线程支持,但是这些功能可以增强上述四个主要方面 。
特性您可以使用Apache Shiro进行以下操作:
  • 验证用户身份以验证其身份
  • 对用户执行访问控制,例如:
  • 确定是否为用户分配了特定的安全角色
  • 确定是否允许用户做某事
  • 即使在没有Web或EJB容器的情况下,也可以在任何环境中使用Session API 。
  • 在身份验证,访问控制或会话的生存期内对事件做出反应 。
  • 汇总1个或更多用户安全数据的数据源,并将其全部显示为单个复合用户“视图” 。
  • 启用单点登录(SSO)功能
  • 启用“记住我”服务以进行用户关联,而无需登录
为什么要使用 Apache Shiro?自2003年以来,框架环境发生了很大变化,因此今天仍然有充分的理由使用Shiro 。
Apache Shiro 优势如下:
  • 易于使用-易于使用是该项目的最终目标 。应用程序安全性可能非常令人困惑和沮丧,并被视为“必不可少的恶魔” 。如果您使它易于使用,以使新手程序员可以开始使用它,那么就不必再痛苦了 。
  • 全面-没有任何其他安全框架具有Apache Shiro所声称的范围广度,因此它很可能是满足您的安全需求的“一站式服务” 。
  • 灵活-Apache Shiro可以在任何应用程序环境中工作 。虽然它可以在Web,EJB和IoC环境中运行,但不需要它们 。Shiro也不要求任何规范,甚至没有很多依赖性 。
  • 具有Web功能-Apache Shiro具有出色的Web应用程序支持,可让您基于应用程序URL和Web协议(例如REST)创建灵活的安全策略,同时还提供了一组JSP库来控制页面输出 。
  • 可插拔-Shiro简洁的API和设计模式可轻松与许多其他框架和应用程序集成 。您会看到Shiro与Spring,Grails,Wicket,Tapestry,Mule,Apache Camel,Vaadin等框架无缝集成 。
  • 受支持-Apache Shiro是Apache Software Foundation的一部分,该组织被证明以其社区的最大利益行事 。项目开发和用户群体友好的公民随时可以提供帮助 。如果需要,像Katasoft这样的商业公司也可以提供专业的支持和服务 。
核心概念:Subject,SecurityManager 和 RealmsShiro的体系结构具有三个主要概念-主题(Subject),安全管理器(SecurityManager)和领域(Realms) 。
shiro 安全框架入门,看这一篇就够了

文章插图
概念
Subject在保护应用程序安全时,可能要问自己最相关的问题是:“当前用户是谁?”或“是否允许当前用户执行X”?
在编写代码或设计用户界面时,我们通常会问自己以下问题:应用程序通常是基于用户案例构建的,并且您希望基于每个用户来表示(和保护)功能 。
因此,我们考虑应用程序安全性的最自然方法是基于当前用户 。
Shiro的API从根本上代表了这种思维方式 。
“主题”一词是一个安全术语,基本上表示“当前正在执行的用户” 。它只是不被称为“用户”,因为“用户”一词通常与人类相关联 。
在安全领域中,“主题”一词可以表示一个人,但也可以指第三方进程,守护程序帐户或任何类似内容 。它仅表示“当前正在与软件交互的事物” 。
不过,对于大多数意图和目的,您都可以将其视为Shiro的“用户”概念 。
您可以在代码中的任何位置轻松获取Shiro主题,如下面的清单1所示 。
  • List1
import org.apache.shiro.subject.Subject;import org.apache.shiro.SecurityUtils;...Subject currentUser = SecurityUtils.getSubject();


推荐阅读