Shiro-04-shiro 详细架构

这篇具有很好参考价值的文章主要介绍了Shiro-04-shiro 详细架构。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

详细架构

下图显示了Shiro的核心架构概念,并简要概述了每个架构:

下面我们对除了核心组件的部分做一下简单的介绍:

Authentication(身份验证)

身份验证是验证用户身份的过程。

也就是说,当用户通过应用程序进行身份验证时,他们在证明自己实际上就是他们所说的身份。有时也称为“登录”。

这通常是一个三步过程。

  1. 收集用户的识别信息(称为主体)和支持身份证明的凭据(称为凭据)。

  2. 将主体和凭据提交到系统。

  3. 如果提交的凭据与系统对该用户身份(本金)的期望匹配,则认为该用户已通过身份验证。如果不匹配,则认为该用户未通过身份验证。

每个人都熟悉的此过程的一个常见示例是用户名/密码组合。当大多数用户登录软件应用程序时,通常会提供其用户名(主体)和支持密码(凭据)。如果存储在系统中的密码(或密码表示形式)与用户指定的密码匹配,则认为它们已通过身份验证。

Shiro以简单直观的方式支持相同的工作流程。

正如我们所说,Shiro具有以主题为中心的API-在运行时,您与Shiro所做的几乎所有事情都是通过与当前正在执行的Subject进行交互来实现的。

因此,要登录主题,您只需调用其登录方法,并传递一个AuthenticationToken实例,该实例代表所提交的主体和凭据(在本例中为用户名和密码)。

此示例在下面的清单5中显示。

  • 列表5 主题登录
//1. Acquire submitted principals and credentials:
AuthenticationToken token =
new UsernamePasswordToken(username, password);

//2. Get the current Subject:
Subject currentUser = SecurityUtils.getSubject();

//3. Login:
currentUser.login(token);

如您所见,Shiro的API可以轻松反映常见的工作流程。

您会继续将这种简单性视为主题操作的所有操作的主题。

当调用登录方法时,SecurityManager将接收AuthenticationToken并将其分发给一个或多个配置的领域,以允许每个领域根据需要执行身份验证检查。

每个领域都可以根据需要对提交的AuthenticationToken做出反应。

但是,如果登录尝试失败会怎样?

如果用户指定了错误的密码怎么办?

您可以通过对Shiro的运行时AuthenticationException做出反应来处理故障,如清单6所示。

  • 列表6-处理失败的场景
//3. Login:
try {
    currentUser.login(token);
} catch (IncorrectCredentialsException ice) {} catch (LockedAccountException lae) {}catch (AuthenticationException ae) {} 

您可以选择捕获AuthenticationException子类之一并作出具体反应,或者一般性地处理任何AuthenticationException(例如,向用户显示通用的“用户名或密码错误”消息)。

选择取决于您,具体取决于您的应用程序需求。

主题成功登录后,它们被认为已通过身份验证,通常您允许他们使用您的应用程序。

但是,仅仅因为用户证明了自己的身份并不意味着他们可以在应用程序中做任何想做的事情。

这就引出了下一个问题:“如何控制允许用户执行或不执行的操作?” 确定允许用户执行的操作称为授权。

接下来,我们将介绍Shiro如何启用授权。

Authorization(授权)

授权本质上是访问控制-控制用户可以在应用程序中访问的内容(例如资源,网页等)。

大多数用户通过使用角色和权限等概念来执行访问控制。

也就是说,通常根据分配给他们的角色和/或权限,允许用户执行某项操作或不执行某项操作。

然后,您的应用程序可以根据对这些角色和权限的检查来控制公开哪些功能。

如您所料,主题API使您可以非常轻松地执行角色和权限检查。

例如,清单7中的代码片段显示了如何检查Subject是否被分配了特定角色。

  • 清单7-角色检查
if ( subject.hasRole("administrator") ) {
    //show the ‘Create User’ button
} else {
    //grey-out the button?
} 

如您所见,您的应用程序可以基于访问控制检查来启用或禁用功能。

权限检查是执行授权的另一种方法。

如上例所示,检查角色存在一个重大缺陷:您无法在运行时添加或删除角色。您的代码使用角色名称进行了硬编码,因此,如果更改了角色名称和/或配置,则代码将被破坏!如果您需要能够在运行时更改角色的含义,或者根据需要添加或删除角色,则必须依靠其他方式。

为此,Shiro支持其权限概念。

权限是对功能的原始说明,例如“开门”,“创建博客条目”,“删除’jsmith’用户”等。

通过使权限反映您的应用程序的原始功能,您只需更改权限检查何时更改应用程序的功能。反过来,您可以在运行时根据需要向角色或用户分配权限。

作为一个示例,如下面的清单8所示,我们可以重写之前的角色检查,而使用权限检查。

  • 清单8-权限检测
if (subject.isPermitted("user:create") ) {
    //show the ‘Create User’ button
} else {
    //grey-out the button?
} 

这样,分配了 user:create 权限的任何角色或用户都可以单击“Create User”按钮,并且这些角色和分配甚至可以在运行时更改,从而为您提供了非常灵活的安全模型。

“usercreate”字符串是遵循某些解析约定的权限字符串的示例。

Shiro的WildcardPermission支持此约定。

尽管不在本介绍文章的讨论范围之内,但您会发现WildcardPermission在创建安全策略时可以非常灵活,甚至还支持实例级访问控制之类的功能。

  • 清单9-实例级别权限校验
if ( subject.isPermitted(“user:delete:jsmith”) ) {
    //delete the ‘jsmith’ user
} else {
    //don’t delete ‘jsmith’
}

此示例表明,如果需要,您可以控制甚至访问非常细致的实例级别。

如果愿意,您甚至可以发明自己的权限语法。

有关更多信息,请参见 Shiro权限文档。

最后,与身份验证一样,上述调用最终也进入了SecurityManager,后者将咨询一个或多个Realms来做出访问控制决策。 这使领域可以根据需要响应身份验证和授权操作。

这就是Shiro授权功能的简要概述。

尽管大多数安全框架都停止了身份验证和授权,但Shiro提供了更多功能。

接下来,我们将讨论Shiro的高级会话管理功能。

会话管理

Apache Shiro在安全框架领域提供了一些独特的功能:可在任何应用程序和任何体系结构层中使用的一致的Session API。

也就是说,Shiro为任何应用程序启用了会话编程范例-从小型守护程序独立应用程序到最大的群集Web应用程序。

这意味着希望使用会话的应用程序开发人员不再需要,则不再需要使用Servlet或EJB容器。或者,如果使用这些容器,则开发人员现在可以选择在任何层中使用统一且一致的会话API,而不是使用servlet或EJB特定的机制。

但是Shiro会话的最重要好处之一就是它们与容器无关。

这具有微妙但极其强大的含义。

例如,让我们考虑会话集群。有多少种特定于容器的方式可以将会话群集在一起以实现容错和故障转移?

Tomcat与Jetty的功能不同,而Jetty与Websphere的功能不同。但是,通过Shiro会话,您可以获得独立于容器的集群解决方案。

Shiro的体系结构允许可插入的Session数据存储,例如企业缓存,关系数据库,NoSQL系统等等。

这意味着您只需配置一次会话集群,无论部署环境如何(Tomcat,Jetty,JEE Server或独立应用程序),它都将以相同的方式工作。

无需根据部署应用程序的方式重新配置应用程序。

Shiro会话的另一个好处是,如果需要,会话数据可以跨客户端技术共享

例如,如果需要,Swing桌面客户端可以参加相同的Web应用程序会话-如果最终用户同时使用这两个客户端,则很有用。

那么,您如何在任何环境中访问主题的会话?

如下面的示例所示,有两种Subject方法。

  • Listing 10. Subject’s Session
Session session = subject.getSession();
Session session = subject.getSession(boolean create);

如您所见,这些方法在概念上与HttpServletRequest API相同。

第一种方法将返回主题的现有会话,或者如果没有,则创建一个新的会话并返回。

第二种方法接受一个布尔参数,该参数确定是否将创建一个新的会话(如果尚不存在)。

获取主题的会话后,就可以将其几乎与HttpSession一样使用。

Shiro团队认为HttpSession API最适合Java开发人员,因此我们保留了大部分感觉。

当然,最大的区别是您可以在任何应用程序中使用Shiro Sessions,而不仅仅是Web应用程序。

清单11显示了这种熟悉程度。

  • Listing 11. Session methods
Session session = subject.getSession();
session.getAttribute("key", someValue);
Date start = session.getStartTimestamp();
Date timestamp = session.getLastAccessTime();
session.setTimeout(millis);

Shiro-04-shiro 详细架构,安全,web,架构,java,开发语言文章来源地址https://www.toymoban.com/news/detail-836329.html

到了这里,关于Shiro-04-shiro 详细架构的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 3万字《SpringBoot微服务开发——Shiro(安全)》

    log4j.logger.org.apache.shiro.util.ThreadContext=WARN log4j.logger.org.apache.shiro.cache.ehcache.EhCache=WARN shiro.ini ,需要安装ini插件 [users] root = secret, admin guest = guest, guest presidentskroob = 12345, president darkhelmet = ludicrousspeed, darklord, schwartz lonestarr = vespa, goodguy, schwartz [roles] admin = * schwartz = lightsaber:* go

    2024年04月18日
    浏览(21)
  • [Java安全]—Shiro回显内存马注入

    文章首发于先知社区:Shiro回显内存马注入 接上篇[Java安全]—Tomcat反序列化注入回显内存马_,在上篇提到师傅们找到了一种Tomcat注入回显内存马的方法, 但他其实有个不足之处:由于shiro中自定义了一个filter,因此无法在shiro中注入内存马。 所以在后边师傅们又找到了一个

    2024年02月06日
    浏览(18)
  • java之路 —— Shiro与Springboot整合开发

    在 Spring Boot 中做权限管理,一般来说,主流的方案是 Spring Security ,但是,仅仅从技术角度来说,也可以使用 Shiro。 在 Spring Boot 中做权限管理,一般来说,主流的方案是 Spring Security ,但是,仅仅从技术角度来说,也可以使用 Shiro。 在整合之前,让我们先来了解一下Shiro开发

    2024年02月11日
    浏览(18)
  • Spring Boot进阶(84):Spring Boot集成Shiro:安全、简单、快捷 | 超级详细,建议收藏

            随着互联网的快速发展,越来越多的应用程序需要进行用户身份验证和权限控制,保障系统的安全性和稳定性,以此而来Shiro。Shiro是一个易于使用的Java安全框架,其提供了身份验证、授权、加密、会话管理等功能,可以轻松地与Spring框架集成,是企业级应用程序

    2024年02月04日
    浏览(19)
  • 【java安全】无Commons-Collections的Shiro550反序列化利用

    Shiro550利用的难点 前面我们学习Shiro反序列化漏洞时,使用了一个简单的shiroDemo,在这个Demo中引入了一些依赖: shiro-core、shiro-web,这是shiro本身的依赖 javax.servlet-api、jsp-api,这是JSP和Servlet的依赖,仅在编译阶段使用,因为Tomcat中自带这 两个依赖 slf4j-api、slf4j-simple,这是为

    2024年02月13日
    浏览(13)
  • 017-信息打点-语言框架&开发组件&FastJson&Shiro&Log4j&SpringBoot等

    1、CMS指纹识别-不出网程序识别 2、开发框架识别-PHPPythonJava 3、开发组件识别-Java常见安全漏洞组件 解决: 1、CMS识别到后期漏洞利用和代码审计 2、开发框架识别到后期漏洞利用和代码审计 3、开发组件识别到后期漏洞利用和代码审计 演示案例: ➢指纹识别-本地工具-GotoSc

    2024年01月21日
    浏览(23)
  • Shiro框架:Shiro SecurityManager安全管理器解析

    目录 1. SecurityManager介绍 1.1 Authenticator 1.2 Authorizer 1.3 SessionManager 2. DefaultWebSecurityManager解析 2.1 Destroyable 2.2 CacheManagerAware 2.3 EventBusAware 2.4 CachingSecurityManager(聚合缓存管理和事件监听管理功能) 2.5 RealmSecurityManager(聚合Realm管理功能) 2.6 AuthenticatingSecurityManager(聚合登

    2024年01月17日
    浏览(20)
  • Shiro安全(三):Shiro自身利用链之CommonsBeanutils

    前面在利用shiro反序列化时,都是利用CC链,但是这需要服务端引入CommonsCollections组件。所以最好是找到一条shiro自身的利用链,而不需要任何的前提条件 在之前曾介绍过 java.util.PriorityQueue ,在反序列化这个对象时,为了保证队列顺序,会进行重排序的操作,而排序就涉 及到

    2024年02月07日
    浏览(10)
  • Shiro-11-web 介绍

    将Shiro集成到任何web应用程序的最简单方法是在web.xml中配置一个Servlet ContextListener和过滤器,该Servlet了解如何读取Shiro的INI配置。 INI配置格式本身的大部分是在配置页面的INI部分中定义的,但是我们将在这里介绍一些额外的特定于web的部分。 使用 Spring? Spring Framework用户不会

    2024年02月19日
    浏览(19)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包