1.简述
Shiro是apache旗下一个开源安全框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证、权限授权、加密、会话管理等功能,组成了一个通用的安全认证框架。使用shiro就可以非常快速的完成认证、授权等功能的开发,降低系统成本。
官网地址:https://github.com/apache/shiro
Shiro的优点:
- 功能强大、 简单、灵活, 不跟任何的框架或者容器绑定,可以独立运行。
Shiro的缺点:
- 社区不灵活,本身并没有实现缓存,需自行实现。
Shiro特点:
- 易于理解的 Java Security API。
- 简单的身份认证(登录),支持多种数据源(LDAP,JDBC,Kerberos,ActiveDirectory 等)。
- 对角色的简单的签权(访问控制),支持细粒度的签权。
- 支持一级缓存,以提升应用程序的性能。
- 内置的基于 POJO 企业会话管理,适用于 Web 以及非 Web 的环境。
- 异构客户端会话访问。
- 非常简单的加密API。
- 不跟任何的框架或者容器捆绑,可以独立运行。
2.Shiro概要架构
Shiro架构包含三个主要的理念:
- Subject:主体对象,负责提交用户认证和授权信息。
- SecurityManager:安全管理器,负责认证,授权等业务实现。
- Realm:领域对象,负责从数据层获取业务数据。
3.Shiro详细架构
核心对象:认证管理对象、授权管理对象、会话管理对象、缓存管理对象、加密管理对象、realm管理对象(领域对象:负责处理认证和授权领域的数据访问问题)。
subject:与软件交互的一个特定实体(用户、第三方服务)。
SecurityManager(安全管理):Shiro的核心,用来协调管理组件工作。
Authenticator(认证管理):负责执行认证操作。
Authorizer(授权管理):负责执授权检测。
SessionManager(会话管理):负责创建并管理用户Session生命周期,提供一个强有力的Session体验。
SessionDAO:代表SessionManager执行Session持久(CRUD)动作,它允许任何存储的数据挂接到Session管理基础上。
CacheManager(缓存管理):提供创建缓存实例和管理缓存生命周期的功能。
Cryptography(加密管理):提供了加密方式的设计及管理。
Realms(领域对象):Shrio和应用程序安全数据之间的桥梁。
4.shiro认证过程
认证步骤说明:
- 首先调用Subject.login(token)进行登录,其会自动委托给SecurityManager,调用之前必须通过SecurityUtils.setSecurityManager()设置。
- SecurityManager负责真正的身份验证逻辑,它会委托给Authenticator进行身份验证。
- Authenticator才是真正的身份验证者,Shiro API中核心的身份认证入口点,此处可以自定义插入自己的实现。
- Authenticator可能会委托给相应的AuthenticationStrategy进行多Realm身份验证,默认ModularRealmAuthenticator会调用AuthenticationStrategy进行多Realm身份验证。
- Authenticator会把相应的token传入Realm,从Realm获取身份验证信息,如果没有返回或抛出异常表示身份验证失败了。此处可以配置多个Realm,将按照相应的顺序及策略进行访问。