一、Shiro框架介绍
是一个轻量级的安全框架,主要提供了 授权、认证、加密、会话管理这几个功能。
二、shiro安全数据源有哪些
1.数据库
2.静态ini文件
3.session
三、Shiro运行流程
比如一个登陆流程:
1、首先调用Subject.login(token)进行登录,他会委托给SecurityManager
2、SecurityManager负责真正的身份验证逻辑;它会委托给Authenticator进行身份验证;
3、Authenticator会把相应的token传入Realm,从Realm获取身份验证信息,如果没有就返回认证失败,有的话就继续执行操作。
四、Shiro 的优点
1、简单的身份认证, 支持多种数据源;非常简单的加密 API;
2、对角色的简单的授权, 支持细粒度的授权(方法级);
3、支持一级缓存,以提升应用程序的性能;
4、内置的基于 POJO 企业会话管理, 适用于 Web 以及非 Web 的环境;
5、不跟任何的框架或者容器捆绑, 可以独立运行。
五、比较 SpringSecurity 和 Shiro
1、相比 Spring Security, Shiro 在保持强大功能的同时, 使用简单性和灵活性;
2、SpringSecurity: 即使是一个一个简单的请求,最少得经过它的 8 个Filter;
3、SpringSecurity 必须在 Spring 的环境下使用;
4、初学 Spring Security, 曲线还是较大, 需要深入学习其源码和框架, 配置起来也较费力。
六、简述 Shiro 的3个核心组件
1.Subject
正与系统进行交互的人, 或某一个第三方服务。
所有 Subject 实例都被绑定到一个SecurityManager 上。
2.SecurityManager
Shiro 架构的心脏, 用来协调内部各安全组件, 管理内部组件实例, 并通过它来提供安全管理的各种服务。
当 Shiro 与一个 Subject 进行交互时, 实质上是幕后的 SecurityManager 处理所有繁重的 Subject 安全操作。
3.Realms
本质上是一个特定安全的 DAO. 当配置 Shiro 时, 必须指定至少一个 Realm 用来进行身份验证和授权。
Shiro 提供了多种可用的 Realms 来获取安全相关的数据. 例如关系数据库(JDBC), INI 及属性文件等。
可以定义自己 Realm 实现来代表自定义的数据源。
七、Shiro认证过程
1、应用程序代码调用 Subject.login 方法,传递创建好的包含终端用户的 Principals(身份)和 Credentials(凭证)的 AuthenticationToken 实例;
2、Subject 实例委托应用程序的 SecurityManager 通过调用securityManager.login(token) 开始真正的验证;
Subject 实例(通常为 DelegatingSubject或它的子类)
3、SubjectManager 接收 token,调用内部的 Authenticator 实例调用 authenticator.authenticate(token).Authenticator 通常是一个 ModularRealmAuthenticator 实例, 支持在身份验证中协调一个或多个Realm 实例;
4、如果应用程序中配置了一个以上的 Realm, ModularRealmAuthenticator 实例将利用配置好的AuthenticationStrategy 来启动 Multi-Realm 认证尝试。在Realms 被身份验证调用之前、调用期间、调用之后,AuthenticationStrategy 被调用使其能够对每个Realm 的结果作出反应。(AuthenticationStrategy都会被调用,对每个Realm 的结果作出反应);
5、每个配置的 Realm 用来帮助看它是否支持提交的 AuthenticationToken. 如果支持, 那么支持 Realm 的 getAuthenticationInfo 方法将会伴随着提交的 token 被调用. getAuthenticationInfo 方法有效地代表一个特定 Realm 的单一的身份验证尝试。
八、Shiro授权过程
1、应用程序或框架代码调用任何 Subject 的hasRole*, checkRole*, isPermitted*,或者checkPermission方法的变体, 传递任何所需的权限;
2、Subject 的实例 调用securityManager 的对应的方法。
Subject 实例(通常为 DelegatingSubject或它的子类)
3、SecurityManager 调用 org.apache.shiro.authz.Authorizer 接口的对应方法.默认情况下,authorizer 实例是一个 ModularRealmAuthorizer 实例, 它支持协调任何授权操作过程中的一个或多个Realm 实例;
4、每个配置好的 Realm 被检查是否实现了相同的 Authorizer 接口. 如果是, Realm 各自的 hasRole, checkRole*,isPermitted*,或 checkPermission* 方法将被调用。
九、Shiro 如何自实现认证
Shiro 的认证过程由 Realm 执行,SecurityManager 会调用 org.apache.shiro.realm.Realm 的 getAuthenticationInfo(AuthenticationToken token) 方法。实际开发中, 通常提供 org.apache.shiro.realm.AuthenticatingRealm 的实现类, 并在该实现类中提供 doGetAuthenticationInfo(AuthenticationToken token)方法的具体实现
十、如何实现自实现授权
实际开发中,通常提供org.apache.shiro.realm.AuthorizingRealm的实现类,并提供 doGetAuthorizationInfo(PrincipalCollection principals) 方法的具体实现。
十一、如何配置在 Spring 中配置使用 Shiro
1、在 web.xml 中配置 Shiro 的 Filter;
2、在 Spring 的配置文件中配置 Shiro;
3、配置自定义 Realm:实现自定义认证和授权;
4、配置 Shiro 实体类使用的缓存策略;
5、配置 SecurityManager;
6、配置保证 Shiro 内部 Bean 声明周期都得到执行的 Lifecycle Bean 后置处理器;
7、配置AOP 式方法级权限检查;
8、配置 Shiro Filter。
十二、在ShiroFilterFactoryBean中添加shiro的内置过滤器
anno:无需认证就可以访问
authc:必须认证了才能访问
user: 必须拥有 记住我功能才能访问
perms:拥有对某个资源的权限才能访问
role:拥有某个角色才能访问