shiro

 

一.各组件:

shiro

      1.Authentication :身份认证/登录,验证用户是不是拥有相应的身份;

      2.Authorization :授权,即权限验证,验证某个已认证的用户是否拥有某个权限;即判断用户是否能进行什么操作,如:验证某个用户是否拥有某个角色。或者细粒度的验证某个用户对某个资源是否具有某个权限;

     3.Session Manager :会话管理,即用户登录后就是一-次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通JavaSE环境,也可以是Web环境的;

      4.Cryptography :加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储;Web Support : Web支持,可以非常容易的集成到Web环境;

      5.Caching :缓存,比如用户登录后,其用户信息、拥有的角色/权限不必每次去查,这样可以提高效率;

      6.Concurrency : Shiro支持多线程应用的并发验证,即如在一个线程中开启另一 个线程,能把权限自动传播过去;

      7.Testing :提供测试支持;

      8.Run As :允许-个用户假装为另一个用户(如果他们允许)的身份进行访问

      9.Remember Me :记住我,这个是非常常见的功能,即一次登录后,下次再来的话不用登录了

 

二.系统架构

      shiro

 

 


      1.Subject :应用代码直接交互的对象是Subject ,也就是说Shiro的对外API核心就是Subject。Subject 代表了当前“用户”,  这个用户不一定是一个具体的人,与当前应用交互的任何东西都是Subject ,如网络爬虫,机器人等;

      2.SecurityManager ;Subject其实是一个门面, SecurityManager才是实际的执行者;SecurityManager :安全管理器;即所有与安全有关的操作都会与其相关

      3.SecurityManager交互;且其管理着所有Subject ;可以看出它是Shiro的核心,它负责与Shiro的其他组件进行交互,它相当于   SpringMVC中DispatcherServlet的角色

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

 

三.拦截ShiroFilter

   shiro

      1. [urls]部分的配置,其格式是:  "url=拦截器[参数] ,拦截器[参数]”;如果当前请求的url匹配[urls]部分的某个url模式,将会执行其配置的拦截器。
           anon ( anonymous )拦截器表示匿名访问(即不需要登录即可访问)
           authc ( authentication )拦截器表示需要身份认证通过后才能访问

      2.url模式使用Ant风格: 模式Ant路径通配符支持?、*、**,注意通配符匹配不包括目录分隔符"/”:
          -?:匹配一个字符,如/admin?将匹配/admin1,但不匹配/admin或/admin/ ;
          - * :匹配零个或多个字符串,如/admin将匹配/admin、/admin123 ,但不匹配/admin/1 ;
          _** .匹配路径中的零个或多个路径,如/admin/**将匹配/admin/a或/admin/a/b

     3.URL权限: 采取第一次匹配优先的方式,即从头开始使用第一个匹配的url模式对应的拦截器链。如:
            - /bb/** =filter1
            /bb/aa=filter2- /** =filter3
             如果请求的ur|是"/bb/aa" ,因为按照声明顺序进行匹配,那么将使用filter1进行拦截。

 

四.认证流程

   

1.获取当前的Subject.  调用SecurityUtils . getSubject() ;

2.  测试当前的用户是否已经被认证,即是否已经登录.  调用Subject的isAuthenticated ()3.  若没有被认证,  则把用户名和密码封装为Use rnamePasswordToken对象

   1) .  创建一个表单页面

   2).把请求提交到SpringMVC的Handler

   3) .获取用户名和密码. 

4.  执行登录:调用Subject的login (AuthenticationToken)  方法.

5.  自定义Realm的方法,从数据库中获取对应的记录,返回给Shiro.

  1) .实际_ 上需要继承org .apache. shiro. realm. AuthenticatingRealm 类

  2) .  实现doGe tAuthenticationInfo (AuthenticationToken)  方法。

6.由shiro完成对密码的比对.