Shiro理论知识
一、RABC回顾
RBAC是一个基于角色的访问控制,其实就是一种数据库的设计思想
概念介绍
- 基于角色的权限访问控制(Role-Based Access Control)作为传统访问控制(自主访问、强制访问)的有前景的代替收到广泛的关注
- 在RBAC中,权限与角色关联,用户通过成为适当角色的成员而得到这些角色的权限,这就极大的简化了权限的管理
- RBAC:一种数据库设计思想,根据数据库设计方案,完成项目的权限控制
- 权限:具备操作事物的能力
- 角色:一系列权限的集合
二、Shiro简介
上面提到RBAC是一种数据库的设计思想,那么具体的实现还是需要开发者自己完成,那么反复的多表查询和相关的权限角色逻辑代码编写是相当头疼的一件事,所以就有了Shiro框架
官方解释
Apache Shiro 是一个强大的并且简答医用的java权限框架,主要应用有:
- 认证:Authentication,也就是登录
- 授权:Authorization,也就是校验认证用户是否具备某个权限或角色
- 加密:cryptography,对用户的密码进行加密
- Session管理:Session Manager
Shiro具有简单易懂的API,使用Shiro可以快速并且简单的应用到任何应用中,无论是从最小的移动app到最大的企业级web应用都可以使用.
使用RBAC(思想)的时候,权限操作相关的代码都得我们自己写。使用Shiro(框架)后,Shiro已经帮我们写好了一些相关的API。我们直接调用使用即可。
核心功能
Shiro的几大核心功能:
- Authentication 认证。如用户的登录。
- Authorization 授权。用户是否有权限访问指定URL等。
- Cryptography 密码学。如密码的加密。
- Session Management。 Session 管理。
- Web Integration。 Web集成。Shiro不依赖于容器。
三、Shiro架构原理
架构图
架构说明
最上方我们能看到Shiro适合多种语言以及各种类型的项目
Subject
主体,每个用户登录成功后都会对应一个Subject对象,所有用户信息都存放在Subject中。可以理解:Subject就是Shiro提供的用户实体类
(说明:这里登录成功后没有将信息放入session中,是因为如果是javaSE项目的开发,就没有session这个概念,怎么放,但是Shiro也是可以用在JavaSE项目的,所以Shiro自己有Subject对象的话能使它更强大!)
Security Manager
Shiro最大的容器(类似于Spring容器),此容器中包含了Shiro的绝大多数功能。在非Spring Boot项目中,获取Security Manager 是编写代码的第一步。而在Spring Boot中已经帮助我们自动化配置了
Authentication
认证器,执行认证过程调用的组件,里面包含了认证策略(用来校验用户登录的)
Authorizer
授权器,执行授权时调用的组件(登录成功后判断用户拥有的权限和角色)
Session Manager
Shiro被Web集成后,HttpSession对象会由Shiro的Session Manager来管理
Cache Manager
缓存管理,Shiro执行很多第三方缓存技术。例如:EHCache等。(它就是将一些常用的数据信息放到缓存中,避免频繁的访问数据库,比如用户具备的权限)
Session DAO
操作Session内容的组件,(负责对Session中的信息进行增删改操作)
Realms
Shiro框架实现权限控制不依赖于数据库,通过内置数据也可以实现权限控制。但是目前绝大多数应用的数据都存储在数据库中,所以Shiro提供了Realms组件,此组件的作用就是访问数据库。Shiro内置了访问数据库的代码,通过简单配置就可以访问数据库,也可以自定义Realms实现访问数据库逻辑(绝大多数都这么做)
总结
认证
当用户输入登录信息点击登录后,我们通过自定义的Realm将登录信息封装好交给Shiro,它会通过认证器然后将用户输入信息和数据库中的信息进行比对,然后通过是否有异常抛出的方式来告知用户是否登录成功或失败
授权
当用户登录成功后要访问某些资源或页面时,Shiro会通过授权器,从数据库中查询用户拥有的角色或权限,然后决定该用户是否有权限访问某个资源
加密
为了保证用户信息的安全,一般数据库中的敏感信息如密码都是加密后才存入的,Shiro也提供了很多的加密算法,如Base64、MD5等,开发者制定好加密方式告知Shiro,然后当用户输入密码后,Shiro会自动的先对密码加密在与数据库中对比
自定义Realm
上面提到我们需要对用户输入的密码进行加密,但是Shiro框架默认是不会自动加密的,这也就导致它提供的几个Realm中的内部实现代码是不能完成我们想要的效果的,所以我们需要自定义Realm来对它的执行进行干预,让它按照我们指定的规则来执行即可,
Pluggable Realm可以理解为就像插头一样,数据库是插座,你是用哪种方式的Realm就将这个Realm插到数据库这个插座上,然后Shiro就能按照你选择的方式对数据库自动查询了!!