Shiro是强大、精简的Java安全框架。
在认证、授权、加密和会话管理等方面提供直观而又全面的解决方案。
Shiro的一些特性:
- 支持基于各种数据源的认证与授权,可以进行角色或者更细粒度的授权,而且Exception的层次非常丰富。
- 支持缓存以提高应用性能。
- 环境无关的session访问,session管理更趋向于业务,支持SSO、集群、分布式等场景。
- 用更简单的方式对数据进行加密。
- 精简的web安全支持。安全访问URL和资源、自动处理登录登出、remember me等。
- 较少的依赖。通常只需要slf4j和common-beanutils什么的。
即:security framework = authentication+authorization+cryptography+session management
解释一下图中词汇:
- Authentication:认证,简单理解为登录,证明自己是谁。
- Authorization:授权,即谁是否有进行某操作的权限。
- Session Management:用户会话管理,它是环境无关的,在任何应用都可以。
- Cryptography:使用加密算法对数据进行加密,方法非常简便。
- Web Support:对web应用提供非常简便的API。
- Caching:缓存保证安全操作快速有效。
- Concurrency:Shiro支持对多线程应用。
- Testing:即使做了安全设置也不妨碍进行单元或者集成测试。
- “Run As”:权限伪装。
- Remember Me:登录后记住权限。
简单而言,Shiro的架构包括3种概念:
下面是Shiro的详细架构图:
- Subject:用于描述当前执行各种操作的用户。虽然现实生活中"用户"通常是人类,但程序中他也可以是第三方的一些服务,比如爬虫或者定时任务等任何与程序交互的东西。Subject实例绑定于SecurityManager,当我们操作Subject时,其实质是Subject与SecurityManager的交互,Subject是访问SecurityManager的门面。
- SecurityManager:Shiro的核心,'umbrella'object,“罩着”所有安全组件,以让他们顺利执行。同时他也管理着每一个Subject,以针对每一个Subject进行安全操作。
- Authenticator:主要负责认证的组件。登录逻辑由Authenticator执行,从Realm中获取相关数据以确认用户身份。如果存在多个Realm,则会用到Authentication Strategy。比如有一个Realm通过而其他未通过时如何处理,这就是Authentication Startegy的工作。
- Authorizer:负责用户的权限,通过安全数据决定用户是否有权限执行某操作。
- SessionManager:负责会话的生命周期以提供健壮的环境无关的会话体验,环境无关是Shiro的一大卖点。SessionDao则是用来做会话的持久化共组的,可以使用任何数据源。
- CacheManager:用于管理缓存生命周期,认证、权限、会话等信息都可以被缓存起来。
- Cryptography:用于方便加解密。
- Realms:是连接Shiro和数据的桥梁。比如需要用到一些安全相关的数据去进行比如认证或者授权等动作时就会用到Realm。或者可以将Realm理解为安全相关的DAO,用于封装操作安全相关数据的实现细节。Realm可以有很多,但至少一个。