Shiro认证(Authentication)
Shiro简介
Apache Shiro是一个强大易用的Java安全框架,提供了认证、授权、会话管理和加密等功能。
Shiro特性
Shiro可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE环境,也可以用在JavaEE环境。Shiro可以帮助我们完成:认证、授权、会话管理、加密、与Web集成、缓存等,而且Shiro的API也是非常简单的,其基本功能点如下图所示:
Authentication(认证)、Authorization(授权)、Session Management(会话管理)、Cryptography(加密)被Shiro框架的开发团队称之为应用安全的四大基石,详细功能点说明如下:
- Authentication:身份认证/登录,验证用户是不是拥有相应的身份
- Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个权限。即判断用户是否能做事情,常见的如:验证某个用户是否拥有某个角色;或者细粒度的验证某个用户对某个资源是否具有某个权限。
- Session Management:会话管理,即用户登录后就是一次会话,在没有退出之前,它的所有信息都会在会话中,会话可以是普通的JavaSE环境的,也可以是如Web环境
- Cryptography:加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储。
还有其他的功能来支持和加强这些不同应用环境下安全邻域的关注点: - Web Support :Web支持,可以非常容易的集成到Web环境;
- Caching:缓存,比如用户登录后,其用户信息、拥有的角色/权限不必每次去查,这样可以提高效率。
- Concurrency :Shiro 支持多线程应用的并发验证,即如在一个线程中开启另一个线程,能把权限自动传播过去。
- Testing:提供测试支持
- Run As :允许一个用户假装为另一个用户(如果他们允许)的身份进行访问。
- Remember Me :记住我,这个是非常常见的功能,即一次登录后,下次再来的话不用登录了。
Shiro架构
我们分别从外部内部来看看Shiro的架构,对于一个好的框架,从外部来看应该具有非常简单易于使用API,且API契约明确;从内部来看的话,其应该有一个可扩展的架构,即非常容易插入用户自定义实现,因为任何架构都不能满足所有需求。
从外部来看Shiro,即从应用程序的角度来观察如何使用Shiro完成工作,如下图:
可以看到应用代码直接交互的对象是Subject,也就是说Shiro的对外API核心就是Subject;其每个API的含义如下:
- Subject:主体,代表了当前的"用户",这个用户不一定是具体的某一个人,与当前交互的任何东西都可以能是一个Subject,如网络爬虫、机器人等,即一个抽象概念。所有Subject都绑定到SecurityManager,与Subject的所有交互都会委托给SecurityManager。可以把Subject认为是一个们门面,SecurityManager才是实际的执行者。
- SecurityManager:安全管理器,即所有与安全有关的操作都会与SecurityManager交互,且它管理着所有Subject,可以看出它是Shiro的核心,它负责与后边介绍的其他组件进行交互,如果学习过Spring MVC,你可以把它看成DispatcherServlet前端控制器。
- Realm:域,Shiro或Realm对象获取安全数据(如用户、角色、权限ÿ