前言
先感谢涛哥写了这么好的文章
学习完孤傲苍狼和涛哥的博客,觉得分享知识是一种进步,原因很简单:能把别人教会了的博客,一定是好博客。我始终相信,写博客的受益者之一永远都有自己。
因为自己水平有限,推荐看完涛哥的博客后,再来看看我写的总结,对于博主来说,就已经心满意足了。本系列已经默认你有一定的Java基础。如果您有任何疑问或者建议,欢迎在文章下面进行评论。我期待与大家一起交流学习、共同进步。
一、基本流程
Subject:主体,用来与用户交互的对象。它其实是一个门面对象,专门用于管理来自客户端的数据。比如客户端传来了一批帐号密码数据,它需要将这批数据传入Shiro的内部核心SecurityManager中,以验证帐号密码是否正确。再比如,判断当前用户是否有相关的角色,Subject会去问问内部的SecurityManager,这个人是“小学生角色”吗?
你懂的理解就是:Subject就是一个拉客滴,它知道本会所提供的所有服务。来了一批客人,它需要将客人引进到SecurityManager中进行服务,所以说SecurityManager是shiro底层的核心。
SecurityManager:安全中心,它相当于“用户信息”与“数据源”的中间者。用户信息指用户在WEB页面上输入的数据,通常指 用户名、邮箱、密码、手机号等。 “数据源”指数据库中存放的数据。 SecurityManager的作用就是把“用户信息”拿去与“数据源”比对,看“用户信息”是不是存在于“数据源”中。
Realm:数据源。Shiro从数据库中查询一些数据,保存在Realm这种对象中。Shiro会把从Subject中获取的数据与Realm的数据进行对比,从而确定客户端传来的帐号密码是否正确。
流程如下:
步骤一:Shiro把用户的数据封装成标识token,token一般封装着用户名,密码等信息。
步骤二:使用Subject门面获取到封装着用户的数据的标识token
步骤三:Subject把标识token交给SecurityManager,在SecurityManager安全中心中,SecurityManager把标识token委托给认证器Authenticator进行身份验证。认证器的作用一般是用来指定如何验证,它规定本次认证用到哪些Realm。
步骤四:认证器Authenticator将传入的标识token,与数据源Realm对比,验证token是否合法。
从代码的层面来理解: Subject对象其实是一个门面类,它能够执行非常多的操作,例如认证授权用户退出。但是它实际上将这些操作委托给内部的SecurityManager去做。简单点说,Subject的底层实现就是SecurityManager。
public class Subject ...
private SecurityManager securityManager;
public void 我们有按摩服务() { securityManager. 按摩() ; }
二、验证代码
首先导入shiro的依赖。
编写Junit测试用例
仅仅寥寥几行代码就能展现出大佬的代码风范。首先使用工厂设计模式,通过一个工厂返回一个SecurityManager实例。再者,Subject对象负责与用户交互,接收客户端数据,将数据封装好后委托给内部的SecurityManager对象,上述步骤则是门面设计模式的体现,Subject是门面,SecurityManager是底层核心。
最后编写我们的shiro配置文件 shiro_1.ini。
shiro_1.ini配置文件内容如下,它就是数据源Realm。