Marco's Java【Shiro入门(一) 之 Shiro安全框架概述及流程简单分析】

前言

安全领域一直都是各行各业非常重视的问题,它小到个人隐私,大到国家机密,其实大家也已经发现了,在这个被支付宝和微信笼罩着的时代,现如今纸质货币流通量已经没有以往那么大了,可以说虚拟货币的流通逐渐的取代了纸质货币的地位,那么这种虚拟货币的流通依赖的是什么呢?
没错,就是网络,因此对于这种货币流通的平台来说,安全问题绝对是需要排在第一位的,如果安全没有做好,那恐怕我是要第一个冲进阿里巴巴和腾讯大楼的人了…

咳咳…进入正题,本节呢我们就要讲到一个和安全挂钩的框架,叫做Shiro

什么是Shiro

相信什么是Shiro,大家通过标题都能略知一二了,那我们还是来看看官方概述

Apache Shiro 是Java 的一个安全框架。Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE
环境,也可以用在JavaEE 环境。Shiro 可以帮助我们完成:认证、授权、加密、会话管理、与Web 集成、缓存等。使用shiro就可以非常快速的完成认证、授权等功能的开发,降低系统成本。
shiro使用广泛,它可以运行在web应用,非web应用,集群分布式应用中越来越多的用户开始使用shiro。
java领域中spring security(原名Acegi)也是一个开源的权限管理框架,但是spring security依赖spring运行,而shiro就相对独立,最主要是因为shiro使用简单、灵活,所以现在越来越多的用户选择shiro

首先第一个关键字,shiro毋庸置疑是一个安全框架,那么它的功能肯定是和安全挂钩的,就好比说我们的用户登录,这就是一个典型的和安全挂钩的功能,再者我们做一个管理系统,会给每一个用户分配角色,每个角色又可以分配多个权限,那么这种涉及到权限管理的功能也隶属于安全管理的范畴。
在这里插入图片描述
了解一个框架就要先了解它的整体架构,我们先来看看这上面的每一个模块分别代表着什么意思

Authentication :身份认证/登录,验证用户是不是拥有相应的身份

Authorization :授权,即权限验证,验证某个已认证的用户是否拥有某个权限;即判断用
户是否能做事情,常见的如:验证某个用户是否拥有某个角色。或者细粒度的验证某个用 户对某个资源是否具有某个权限

Session Manager :会话管理,即用户登录后就是一次会话,在没有退出之前,它的所有信 息都在会话中;会话可以是普通JavaSE环境的,也可以是如Web环境的

Cryptography :加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储

Web Support :Web 支持,可以非常容易的集成到Web 环境

Caching :缓存,比如用户登录后,其用户信息、拥有的角色/权限不必每次去查,这样可以提高效率

Concurrency :shiro 支持多线程应用的并发验证,即如在一个线程中开启另一个线程,能 把权限自动传播过去
Testing :提供测试支持

Run As :允许一个用户假装为另一个用户(如果他们允许)的身份进行访问

Remember Me :记住朕,这个是非常常见的功能,即一次登录后,下次再来的话不用登录了。

需要注意的是Shiro框架虽然为我们提供好这些功能模块,但是还得靠我们自己组装,这是啥意思呢?
准确来说Shiro是不会去维护用户、维护权限的,而需要我们自己去设计或提供,然后通过 相应的接口注入给Shiro即可。关于后期项目该如何让SSM集成Shiro,我们后期会明确讲到啦~


Shiro的架构说明

如果说上面的讲解还不足以了解Shiro的架构的话,我们来看看这张经典的Shiro架构模块图,看起来可能会比较复杂,我们从上往下来分析,最上面就是我们的各种语言,比如经典的C++,目前最火的Python,还有全世界最好的语言PHP,以看的出我们的Shiro的使用范围是很广的,那么它是靠什么来实现多语言通用的呢?
在这里插入图片描述
细心的朋友可以发现,我们的图中每个语言的框框下都有Subject,Subject直译过来就是主体的意思,实质上他也是Shiro为各语言提供的一个接口,外部程序通过subject进行认证授,而subject是通过SecurityManager安全管理器进行认证授权,它代表着当前的"操作用户",为什么用引号引起来呢?
因为Subject有可能是人,有可能是其他的三方进程,定时作业等等,但是把它当成用户的话更好理解,每个Subject对象都必须与一个SecurityManager进行绑定,我们所访问Subject对象其实都是在与SecurityManager里的特定Subject进行交互。
在这里插入图片描述
第二个核心部分就是SercurityManager,它是专门管理用户的安全操作的"幕后推手",可以说是Realm的关键所在,一个应用一般来说只有一个SercurityManager的实例。
根据上面的图我们可以看出来SercurityManager所管理的分支有很多,比方说Authenticator认证处理器,Authorizer授权处理器等等,并且整个流程都贯穿着Crytography加密(即密码管理,常见的加密方式有MD5和SHA)。实质上SecurityManager是通过Authenticator进行认证,通过Authorizer进行授权,通过SessionManager进行会话管理等。它本质上也是一个接口,分别继承了Authenticator, Authorizer, SessionManager这三个接口。

第三个核心部分就是Realms,直译为领域,看起来很低调的Realms充当了Shiro与应用安全数据间的"桥梁",这是不是和我们的MVC模型中的Dao很相似?因为Shiro全程贯穿的都是Sercurity,因此你也可以把它当作是一个安全的Dao。

另外得几个模块sessionManager、SessionDAO、CacheManager大家也可以适当先了解下啦

sessionManager
sessionManager即会话管理,shiro框架定义了一套会话管理,它不依赖web容器的session,所以shiro可以使用在非web应用上,也可以将分布式应用的会话集中在一点管理,此特性可使它实现单点登录。
SessionDAO
SessionDAO即会话dao,是对session会话操作的一套接口,比如要将session存储到数据库,可以通过jdbc将会话存储到数据库。
CacheManager
CacheManager即缓存管理,将用户权限数据存储在缓存,这样可以提高性能。

Subject和Realms可以算得上是SercurityManager得光明左右使了,这三个核心部分基本上撑起了Shiro框架,为了我们数据得安全提供了保障。
在这里插入图片描述
在了解上面的概念之后我们再来看这张流程图,理解起来是不是会容易的多了呢?
我们来简单的缕一缕,举个简单的栗子,还是以我们的登录为例子,当我们输入账号密码之后,会进行登录验证吧?使用了Shiro框架之后,Shiro会将我们的账号和密码封装一个token令牌,我们获取主体对象之后调用login方法,这个时候就交给我们的SecurityManager进行处理,其实看底层,Subject.login(token)本质上是调用
securityManager.login(this, token)这个方法获取Subject对象,因为Subject是一个接口,是不能直接new对象的。
接着呢我们呢会进到Authenticator认证处理器中,而Authenticator又会通知Realms,“嘿,你去数据库帮看下这个登录进来的人有没有注册过啊?”
Realms查完之后要么回复"没有",要么会返回查询到的结果,当然了,这个结果是经过封装之后的,后面我们分析Shiro的底层的时候会给大家详细讲到。

后语

Shiro理解起来可能会相对困难,后面呢我也会带着大家去看Shiro的底层,更深入的了解它的运行机制之后呢,使用起来就不会生疏啦,上面的这些概念还是尽量吸收一下,对后面的更深入的理解和使用是有很大帮助的哦。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值