shiro详解第一篇

此内容根据官方文档翻译,加上自己的理解

1. SecurityManager

中心管理器:SecurityManager

通常情况下一个应用只有一个SecurityManager实例

创建:

  1. Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini")
  2. SecurityManager securityManager = factory.getInstance();
  3. SecurityUtils.setSecurityManager(securityManager);

 

 

2.Subject

当前用户: Subject

谁是当前用户?下面作解释

在几乎所有环境中,您都可以通过以下调用获取当前执行的用户:

Subject currentUser = SecurityUtils.getSubject();

使用该方法,我们会获得当前正在执行的subject,详细点解释就是,

获取当前线程或者当前请求相关联的基于用户数据信息。

 

Subject 可以做什么?

官方语:If you want to make things available to the user during their current session with the application, you can get their session:

谷歌翻译:如果要在用户与应用程序的当前会话期间使事情可用,则可以获取他们的会话:

网易云翻译:如果你想让用户在他们当前的会话中使用这些东西,你可以得到他们的会话

Session session = currentUser.getSession();

session.setAttribute( "someKey", "aValue" );

 

上面subject 代表当前用户,那么谁是当前用户呢?当前用户即是登录用户,但是到现在为止并没有发生登录,所以目前的当前用户是一个匿名用户,因此我们需要先走登录流程:

if ( !currentUser.isAuthenticated() ) {// 若当前用户未登录

 

UsernamePasswordToken token = new UsernamePasswordToken("lonestarr", "vespa");

 

token.setRememberMe(true);

 

currentUser.login(token);

 

}

 

currentUser.isAuthenticated()//当前用户是否已认证,认证是发生在登录流程的时候,shiro的流程是提交请求(举例是登录请求),认证该用户是否合法(此处后面讲),如果合法,继续走鉴权步骤。走完是否合法后,如果登录成功(即合法),该方法返回true.

 

到目前为止,我们已经有一个登录用户了,那此时我们还能做什么呢?

让我们看看他们(当前登录后用户)是谁:

log.info( "User [" + currentUser.getPrincipal() + "] logged in successfully." );

我们也可以检查他们是否有某个权限:

 

if ( currentUser.hasRole( "schwartz" ) ) {

    log.info("May the Schwartz be with you!" );

} else {

    log.info( "Hello, mere mortal." );

}

查看是否有某个应用(比如菜单,按钮或者某些操作对应的请求)的操作权限

if ( currentUser.isPermitted( "lightsaber:wield" ) ) {

    log.info("You may use a lightsaber ring.  Use it wisely.");

} else {

    log.info("Sorry, lightsaber rings are for schwartz masters only.");

}

 

登出操作:

currentUser.logout();

删除所有标识信息(如认证信息,鉴权信息等)并清空当前会话(即session

 

 

如果想做更多的事情,就必须了解shiro的体系结构了

 

3.shiro构架

在最高概念层次,shiro的建筑有3个主要的概念:SubjectSecurityManagerRealms。下图是这些组件如何交互的高级概述,我们将在下面介绍每个概念:

Subject当前用户(登录前或者登录后)

Subject实例都绑定到(并且需要)SecurityManager。当您与Subject交互时,这些交互转化为与SecurityManager的特定主题交互。(没整明白啥意思)

 

ecurityManagerSecurityManagerShiro体系结构的核心,充当一种伞形对象,协调其内部安全组件,这些组件一起构成了一个对象图。然而,一旦为应用程序配置了SecurityManager及其内部对象图,它通常就会被置之不理,应用程序开发人员几乎把所有的时间都花在主题API上。

我们稍后将详细讨论SecurityManager,但重要的是要认识到,当您与主题交互时,实际上是SecurityManager在幕后为任何主题的安全操作做所有繁重的工作。这反映在上面的基本流程图中。

RealmsRealms充当Shiro和应用程序安全数据之间的桥梁或连接器。当需要与安全相关的数据(如用户帐户)进行实际交互以执行身份验证(登录)和授权(访问控制)时,Shiro会从为应用程序配置的一个或多个领域中查找这些内容(这里的意思是可以在自定义的Realms中连接数据源并获取相关数据(比如根据用户名获取用户信息))。从这个意义上说,领域本质上是一个特定于安全的DAO:它封装了数据源的连接细节,并在需要时让Shiro可以使用相关的数据。在配置Shiro时,必须指定至少一个用于身份验证和/或授权的域。SecurityManager可以配置多个域,但至少需要一个域。Shiro提供了开箱即用的领域,可以连接到许多安全数据源(也就是目录),如LDAP、关系数据库(JDBC)、文本配置源(INI和属性文件)等等。如果默认的领域不能满足您的需求,您可以插入自己的领域实现来表示自定义数据源。与其他内部组件一样,Shiro SecurityManager管理如何使用领域来获取作为主题实例表示的安全性和身份数据。

 

下图展示了Shiro的核心架构概念,并对每个概念进行了简短的总结:

Subject (org.apache.shiro.subject.Subject)

当前用户

 

SecurityManager (org.apache.shiro.mgt.SecurityManager)

如上所述,SecurityManagerShiro体系结构的核心。它主要是一个伞形对象,用来协调它的托管组件,以确保它们能够顺利地一起工作。它还管理Shiro的每个应用程序用户视图,因此它知道如何对每个用户执行安全操作。

Authenticator (org.apache.shiro.authc.Authenticator)

身份验证器是负责执行和响应用户身份验证(登录)尝试的组件。当用户尝试登录时,验证程序将执行该逻辑。验证者知道如何与存储相关用户/帐户信息的一个或多个领域协调。从这些领域获得的数据用于验证用户的身份,以保证用户确实是他们所说的那个人。

         Authenticator子结构)Authentication Strategy (org.apache.shiro.authc.pam.AuthenticationStrategy)

如果配置了多个域,AuthenticationStrategy将协调域以确定身份验证尝试成功或失败的条件(例如,如果一个域成功但其他域失败,尝试成功吗?)所有的领域都必须成功吗?只有第一个?)

Authorizer (org.apache.shiro.authz.Authorizer)

授权者是负责确定应用程序中用户访问控制的组件。它是最终决定用户是否被允许做某事的机制。与Authenticator一样,授权者也知道如何与多个后端数据源协调,以访问角色和权限信息。授权者使用此信息来确定是否允许用户执行给定的操作。

 

SessionManager (org.apache.shiro.session.mgt.SessionManager)

SessionManager知道如何创建和管理用户会话生命周期,为所有环境中的用户提供健壮的会话体验。这是安全框架世界中一个独特的特性——Shiro能够在任何环境中本地管理用户会话,即使没有Web/ServletEJB容器可用。默认情况下,Shiro将使用现有的会话机制(Servlet容器),但如果没有这种机制,例如在独立应用程序或非web环境中,它将使用其内置的企业会话管理来提供相同的进程

 

SessionDAO (org.apache.shiro.session.mgt.eis.SessionDAO)

SessionDAO代表SessionManager执行会话持久性(CRUD)操作。这允许将任何数据存储插入到会话管理基础设施中(也就是提供session的增删改查api)。

 

CacheManager (org.apache.shiro.cache.CacheManager)

CacheManager创建和管理其他Shiro组件使用的缓存实例生命周期。由于Shiro可以访问许多后端数据源进行身份验证、授权和会话管理,因此缓存一直是框架中的一流体系结构特性,可以在使用这些数据源时提高性能。任何现代的开源和/或企业缓存产品都可以插入Shiro,以提供快速和高效的用户体验。(比如用户登录后,把用户的菜单权限存入cache,提高查询性能)

 

Cryptography (org.apache.shiro.crypto.*)

密码学是企业安全框架的自然补充。Shirocrypto包包含易于使用和理解的加密密码表示、散列(又名摘要)和不同的编解码器实现。这个包中的所有类都经过精心设计,非常易于使用和理解。任何使用过Java原生密码学支持的人都知道,驯服它可能是一种具有挑战性的动物。Shirocrypto api简化了复杂的Java机制,并使加密技术易于用于普通人。(加密包,对什么内容加密,目前还不清楚)

Realms (org.apache.shiro.realm.Realm)

如上所述,领域充当Shiro和应用程序安全数据之间的桥梁连接器。当需要与安全相关的数据(如用户帐户)进行实际交互以执行身份验证(登录)和授权(访问控制)时,Shiro会从为应用程序配置的一个或多个领域中查找这些内容。您可以根据需要配置任意多个域(通常每个数据源一个域)Shiro将根据身份验证和授权的需要与它们进行协调。

 

SecurityManager职权:

  • Authentication
  • Authorization
  • Session Management
  • Cache Management
  • Realm coordination
  • Event propagation
  • “Remember Me” Services
  • Subject creation
  • Logout and more.

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值