此内容根据官方文档翻译,加上自己的理解
1. SecurityManager
中心管理器:SecurityManager
通常情况下一个应用只有一个SecurityManager实例
创建:
- Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini")
- SecurityManager securityManager = factory.getInstance();
- 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个主要的概念:Subject
,SecurityManager
和Realms
。下图是这些组件如何交互的高级概述,我们将在下面介绍每个概念:
Subject: 当前用户(登录前或者登录后)
Subject实例都绑定到(并且需要)SecurityManager。当您与Subject交互时,这些交互转化为与SecurityManager的特定主题交互。(没整明白啥意思)
ecurityManager:SecurityManager是Shiro体系结构的核心,充当一种“伞形”对象,协调其内部安全组件,这些组件一起构成了一个对象图。然而,一旦为应用程序配置了SecurityManager及其内部对象图,它通常就会被置之不理,应用程序开发人员几乎把所有的时间都花在主题API上。
我们稍后将详细讨论SecurityManager,但重要的是要认识到,当您与主题交互时,实际上是SecurityManager在幕后为任何主题的安全操作做所有繁重的工作。这反映在上面的基本流程图中。
Realms: Realms充当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)
如上所述,SecurityManager是Shiro体系结构的核心。它主要是一个“伞形”对象,用来协调它的托管组件,以确保它们能够顺利地一起工作。它还管理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/Servlet或EJB容器可用。默认情况下,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.*)
密码学是企业安全框架的自然补充。Shiro的crypto包包含易于使用和理解的加密密码表示、散列(又名摘要)和不同的编解码器实现。这个包中的所有类都经过精心设计,非常易于使用和理解。任何使用过Java原生密码学支持的人都知道,驯服它可能是一种具有挑战性的动物。Shiro的crypto 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.