test

shiro

shiro是java官方推荐的权限框架,值得一看

shiro的四大主要功能如图:

test

ShiroShiro开发团队称为“应用程序的四大基石” ——身份验证,授权,会话管理和加密作为其目标。
 Authentication:有时也简称为“登录”,这是一个证明用户是他们所说的他们是谁的行为。
 Authorization:访问控制的过程,也就是绝对“谁”去访问“什么”。
 Session Management:管理用户特定的会话,即使在非WebEJB应用程序。
 Cryptography:通过使用加密算法保持数据安全同时易于使用。

 也提供了额外的功能来支持和加强在不同环境下所关注的方面,尤其是以下这些:
 Web SupportShiroweb支持的API能够轻松地帮助保护Web应用程序。
 Caching:缓存是Apache Shiro 中的第一层公民,来确保安全操作快速而又高效。
 ConcurrencyApache Shiro 利用它的并发特性来支持多线程应用程序。
 Testing:测试支持的存在来帮助你编写单元测试和集成测试,并确保你的能够如预期的一样安全。
 "Run As":一个允许用户假设为另一个用户身份(如果允许)的功能,有时候在管理脚本很有用。
 "Remember Me":在会话中记住用户的身份,所以他们只需要在强制时候登录。

DEMO
 如何启动shiro先从一个小例子说起
首先,想启动这个框架,需要一些初始化参数,也就是所谓的configuration;
在非web环境下写demo,shiro的configuration暂时现在用shiro.ini提供;
 大体如下:
1.创建factory来加载我们的初始化文件文件shiro.ini;
2.使用factory来创建manager,这里的manager十分重要,是整个框架的核心;
3.将创建的manager,放入securityUtils中,方便项目的任何位置调用securityUtils.xxx();
4.这样,就启动了shiro框架
test
5.紧接着,使用securityUtils来获取用户,通过这个用户,就是可以做接下来的很多操作,比如是否登录,有无权限
test
test
 这里有一个难理解的点,subject是啥?官方说可以理解成“当前用户”,比如当前登录的用户;但是其实这个用户
可以是任何事务(页面请求,restapi,其他程序等),总是,谁在登陆,谁就是subject;
  另外一个是,这里的session也比较特殊,这里虽然支持web session但是,不仅仅支持web session,及时不是
web 环境,这里的session也是能用的,但是我比较关心web session;
6.获取到用户之后就可以看一看,这个用户是否登录?
test
 没有的话,就可以执行登录操作,登录的时候需要先构建一个token;
token是什么,我理解为证明“我是我”的 证据;这个证据可以是多种形式的(当然也有多种现成的实现),比较常用的
 可以是用户名密码什么的;
7.如果登录不成功怎么办?可以通过抛出的各种各样的异常 来判断:
test
到此,登录操作就算是结束了;
8.登录成功后,我们可以执行很多操作,比如:
test
test
test
test
 9.最后,可以执行退出操作;
test
这里面几个比较重要的概念:securityManager,subject;

高等级视图
test 
subject,是正在交互的任何东西;这个subject是需要绑定到manager上的;

securityManager,是这个框架的核心,基本上所有的功能都在这个组件中完成,很像MVC中的dispatcherServlet
负责根据各种请求去调度各种组件

这里新增了一个概念,叫Realm;
最直接的理解,就像是一个dao,在realm里面获取验证信息,比如去数据库里查用户名密码是什么;
 realm是必不可少的,他负责获取登陆和授权需要的各种信息;
realm至少为一个,也可以十多个(不同web应用中,我觉得一个就够了),如果是多个的话,需要配置相应的策略;

下面上一点图方便理解整个流程,和manager里面的组件:
test
test
test
test
test
test
test
test
以上这些组件,都支持get/set 的插拔操作;
如果想自己实现上述的插件,只需要实现之后set进去就可以了;

Configuration
初始化factory,需要配置文件shiro.ini(如图),其实我没怎么看,以后再说
test
Authentication(身份验证/登陆)
test
这个组件里面有两个概念:principle(身份)和credentials(凭证)
其实就可以理解成用户名密码之类的东西;
用户的验证大体需要3个步骤:
test
test
test
test
test
test

验证顺序:
test
test
test

test
这里的意思就是,Authenticator有一个默认的实现,当只有一个realm的时候,直接调用realm,当存在多个的时候,
需要配置一个策略来规范怎么调用这多个realm;
策略大约有三个已有的实现:
test
test

Authorization(用于授权/访问控制)

test