Shiro原理剖析

        Apache Shiro是一个强大而灵活的开源安全框架,它能够干净利落地处理身份认证、授权、企业会话管理和加密。相比spring security框架更简单灵活,spring security对spring依赖较强。shiro可以实现web系统、c/s、分布式等系统权限管理。

        Shiro完整架构图,如下图:

       

        核心组件:

  1. Subject:主体,即当前操作用户
  2. SecurityManager:安全管理器,它是Shiro框架的核心,典型的Facade模式,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务 
  3. Realm:领域,充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息      
  4. Authenticator:认证器,AuthenticationStrategy如果存在多个realm,则按着具体的策略进行登录控制,例如:如果有一个realm成功即可登录、必须所有realm都成功才能登录等 
  5. Authorizer:授权器,决定subject能拥有什么样角色或者权限。
  6. SessionManager:session管理器,创建和管理用户session。通过设置这个管理器,shiro可以在任何环境下使用session。
  7. CacheManager:缓存管理器,可以减少不必要的后台访问。提高应用效率,增加用户体验。
  8. Cryptography:Shiro的api大幅度简化java api中繁琐的密码加密。

        Shiro认证流程:

     

  1. subject(主体)请求认证,调用subject.login(token)
  2. SecurityManager (安全管理器)执行认证
  3. SecurityManager通过ModularRealmAuthenticator进行认证。
  4. ModularRealmAuthenticator将token传给realm,realm根据token中用户信息从数据库查询用户信息(包括身份和凭证)
  5. realm如果查询不到用户给ModularRealmAuthenticator返回null,ModularRealmAuthenticator抛出异常(用户不存在)
  6. realm如果查询到用户给ModularRealmAuthenticator返回AuthenticationInfo(认证信息)
  7. ModularRealmAuthenticator拿着AuthenticationInfo(认证信息)去进行凭证(密码)比对。如果一致则认证通过,如果不致抛出异常(凭证错误)。

       Shiro授权流程:

      

  1. 对subject进行授权,调用方法isPermitted("permission串")
  2. SecurityManager执行授权,通过ModularRealmAuthorizer执行授权
  3. ModularRealmAuthorizer执行realm(自定义的CustomRealm)从数据库查询权限数据调用realm的授权方法:doGetAuthorizationInfo
  4. realm从数据库查询权限数据,返回ModularRealmAuthorizer
  5. ModularRealmAuthorizer调用PermissionResolver进行权限串比对
  6. 如果比对后,isPermitted中"permission串"在realm查询到权限数据中,说明用户访问permission串有权限,否则没有权限,抛出异常。

  Shiro过滤器:    

过滤器简称

对应的java类

anon

org.apache.shiro.web.filter.authc.AnonymousFilter

authc

org.apache.shiro.web.filter.authc.FormAuthenticationFilter

authcBasic

org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter

perms

org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter

port

org.apache.shiro.web.filter.authz.PortFilter

rest

org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter

roles

org.apache.shiro.web.filter.authz.RolesAuthorizationFilter

ssl

org.apache.shiro.web.filter.authz.SslFilter

user

org.apache.shiro.web.filter.authc.UserFilter

logout

org.apache.shiro.web.filter.authc.LogoutFilter

 anon:/admins/**=anon,没有参数,表示可以匿名使用。

 authc:/admins/user/**=authc,没有参数,表示需要认证(登录)才能使用,FormAuthenticationFilter是表单认证,通过记住我认证通过的不可以访问;

 perms:/admins/user/**=perms[user:add:*],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,例如/admins/user/**=perms["user:add:*,user:modify:*"],当有多个参数时必须每个参数都通过才通过,想当于isPermitedAll()方法;

 user:/admins/user/**=user,没有参数,表示必须存在用户, 身份认证通过或通过记住我认证通过的可以访问,当登入操作时不做检查;

 logout:/logout=logout,没有参数,表示退出登录,清楚session。

 

会话管理器(sessionManager):Shiro默认是从cookie中读取sessionId以此来维持会话,也可以自定义sessionManager,继承DefaultWebSessionManager类,重写getSessionId方法。如果在分布式集群环境中可以把session放在redis管理,可以实现session共享。

缓存管理器(cacheManager):Shiro默认整合了EhCache,来实现缓存,可以自定义cacheManager。如果在分布式集群环境中可以把session放在redis管理,可以实现cache共享。

记住我(rememeberMeManager):用户登陆选择“自动登陆”本次登陆成功会向cookie写身份信息,下次登陆从cookie中取出身份信息实现自动登陆。如果使用了UserFilter(例如:/user*=user),又如果设置记住我,下次访问这些url时可以不用登陆。

 

Spring Security与Apache Shiro区别:

1. Shiro配置更加容易理解,容易上手。security配置相对比较难懂;

2. 在Spring的环境下,security整合性更好。Shiro对很多其他的框架兼容性更好,号称是无缝集成;

3. Shiro不仅仅可以使用在web中,它可以工作在任何应用环境中;

4. 在集群会话时Shiro最重要的一个好处或许就是它的会话是独立于容器的;

5. Shiro提供的密码加密使用起来非常方便。

 

PS:本文有些是自己写的,有些是网上抄的,如有发现写错之处请指正,共同学习,共同进步,谢谢。

猜你喜欢

转载自blog.csdn.net/romantic_PK/article/details/81510003