二、了解shiro架构 (10 Minute Tutorial on Apache Shiro)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Mr_yangzc/article/details/81019770
10 Minute Tutorial on Apache Shiro


主要部分:
1) Authentication:身份认证/登录,验证用户是不是拥有相应的身份。
2) Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个权限;即判断用户是否能做事情,常见的如:验证某个用户是否拥有某个角色。或者细粒度的验证某个用户对某个资源是否具有某个权限。
3) Session Manager:会话管理,即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通 JavaSE 环境的,也可以是如 Web 环境的。
4) Cryptography:加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储。


支持:

5) Web Support:Web支持,可以非常容易的集成到 web 环境。
6) Caching:缓存,比如用户登录后,其用户信息、拥有的角色/权限不必每次去查,这样可以提高效率。
7) Concurrency:shiro 支持多线程应用的并发验证,即如在一个线程中开启另一个线程,能把权限自动传播过去。
8) Testing:提供测试支持。
9) Run As:允许一个用户假装为另一个用户(如果他们允许)的身份进行访问。
10) Remember Me:记住我,这个是非常常见的功能,即一次登录后,下次再来的话不用登录了。



1) Subject:主体,代表了当前“用户”。这个用户不一定是一个具体的人,与当前应用交互的任何东西都是 Subject,如网络爬虫,机器人等。所有 Subject 都绑定到 SecurityManager,与 Subject 的所有交互都会委托给 SecurityManager。我们可以把 Subject 认为是一个门面,SecurityManager 才是实际的执行者。
2) SecurityManager:安全管理器。即所有与安全有关的操作都会与 SecurityManager 交互,且它管理着所有 Subject。可以看出它是 Shiro 的核心,它负责其他组件进行交互。
3) Realm:Shiro 从 Realm 获取安全数据(如用户、角色、权限),就是说 SecurityManager 要验证用户身份,那么它需要从 Realm 获取相应的用户进行比较以确定用户身份是否合法,也需要从 Realm 得到用户相应的角色/权限进行验证用户是否能进行操作。 可以配置多个但最少得有一个

3,详细结构

1) Subject  ( org.apache.shiro.subject.Subject )
主体,可以看到主体可以是任何与应用交互的“用户”。
2) SecurityManager  ( org.apache.shiro.mgt.SecurityManager )
它是 Shiro 的核心,所有具体的交互都通过 SecurityManager 进行控制。它管理着所有 Subject、且负责进行认证和授权、及会话、缓存的管理。
3) Authenticator  ( org.apache.shiro.authc.Authenticator )
认证器,负责主体认证的,这是一个扩展点,如果用户觉得 Shiro 默认的不好,我们可以自定义实现。其需要认证策略
(Authentication Strategy  ( org.apache.shiro.authc.pam.AuthenticationStrategy ) ),即什么情况下算用户认证通过了。
4) Authorizer  ( org.apache.shiro.authz.Authorizer )
授权器,或者访问控制器。它用来决定主体是否有权限进行相应的操作,即控制着用户能访问应用中的哪些功能。
5) Realms  ( org.apache.shiro.realm.Realm )
可以有1个或多个 Realm,可以认为是安全实体数据源,即用于获取安全实体的。它可以是 JDBC 实现,也可以是 LDAP 实现,或者内存实现等。
6) SessionManager  ( org.apache.shiro.session.mgt.SessionManager )
如果写过 Servlet 就应该知道 Session 的概念,Session 需要有人去管理它的生命周期,这个组件就是 SessionManager。而 Shiro 并不仅仅可以用在 Web 环境,也可以用在如普通的 JavaSE 环境。
DAO 大家都用过,数据访问对象,用于会话的 CRUD。我们可以自定义 SessionDAO 的实现,控制 session 存储的位置。如通过 JDBC 写到数据库或通过 jedis 写入 redis 中。另外 SessionDAO 中可以使用 Cache 进行缓存,以提高性能。
8) CacheManager  ( org.apache.shiro.cache.CacheManager )
缓存管理器。它来管理如用户、角色、权限等的缓存的。因为这些数据基本上很少去改变,放到缓存中后可以提高访问的性能。
9) Cryptography  ( org.apache.shiro.crypto.* )
密码模块,Shiro 提高了一些常见的加密组件用于如密码加密/解密的。


3.Authenticator 认证 : https://shiro.apache.org/authentication.html

1) 应用程序代码用Subject.login(token)登录方法,通过构造AuthenticationToken实例代表最终用户的主体和凭证。

2)将Subject实例委托给应用程序的SecurityManager(Shiro的安全管理)通过调用securityManager.login(token)来开始实际的认证工作。这里开始真正的认证工作了

3)SecurityManager得到token信息后,通过调用authenticator.authenticate(token)方法,把身份验证委托给内置的Authenticator的实例进行验证。authenticator通常是 ModularRealmAuthenticator
实例,支持对一个或多个Realm实例进行适配。 ModularRealmAuthenticator 提供了一种可插拔的认证风格,你可以在此处插入自定义Realm实现。

4)如果配置了多个Realm,ModularRealmAuthenticator会根据配置的AuthenticationStrategy(身份验证策略)进行多Realm认证过程。
注:如果应用程序中仅配置了一个Realm,Realm将被直接调用而无需再配置认证策略。
我会在后边介绍到身份验证策略
5)判断每个Realm是否支持提交的token,如果支持Realm就会调用getAuthenticationInfo(token)方法进行认证处理。



Authorization has three core elements that we reference quite a bit in Shiro: permissions, roles, and users.
权限仅代表行为


1) 在应用程序中调用授权验证方法
(Subject hasRole* checkRole* isPermitted* ,or  checkPermission*

2)Subject的实例通常是DelegatingSubject类(或子类)的实例对象,在认证开始时,会委托应用程序设置的securityManager实例调用相应的isPermitted*或hasRole*方法。 

3)SecurityManager会委托内置的Authorizer的实例(默认是 ModularRealmAuthorizer 类的实例,类似认证实例,它同样支持一个或多个Realm实例认证)调用相应的授权方法。 

4)每一个Realm将检查是否实现了相同的 Authorizer 接口。然后,将调用Reaml自己的相应的授权验证方法。 



Shiro 从从Realm获取安全数据(如用户、角色、权限),就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较以确定用户身份是否合法;也需要从Realm得到用户相应的角色/权限进行验证用户是否能进行操作;可以把Realm看 成DataSource , 即安全数据源

最基础的是Realm接口,CachingRealm负责缓存处理,AuthenticationReal负责认证,AuthorizingRealm负责授权,通常自定义的realm继承AuthorizingRealm。

Realm能做的工作主要有以下几个方面:
  • 验证是否能登录,并返回验证信息(getAuthenticationInfo方法)
AuthenticationInfo getAuthenticationInfo(AuthenticationToken token)
  • 验证是否有访问指定资源的权限,并返回所拥有的所有权限(getAuthorizationInfo方法)
AuthorizingRealm  中的 getAuthorizationInfo
  • 判断是否支持token(例如:HostAuthenticationToken,UsernamePasswordToken等)(supports方法) boolean supports(AuthenticationToken token)

String getName()
6. Session Management
SessionManagement 管理应用中所有Subject的会话的创建、维护、删除、失效、验证等工作。 与Shiro中的其他核心架构组件一样 ,由顶层组件SecurityManager维护 SessionManager


推荐文章


猜你喜欢

转载自blog.csdn.net/Mr_yangzc/article/details/81019770
今日推荐