目前越来越多的项目都用到了shiro框架,毕竟它简单、容易(呃呃~其实一点都不简单),花三分钟理解下面的三个概念,你就掌握了shiro百分之九十的核心。
一、Subject:主体,代表了当前 “用户”,这个用户不一定是一个具体的人,与当前应用交互的任何东西都是 Subject,如网络爬虫,机器人等;即一个抽象概念;所有 Subject 都绑定到 SecurityManager,与 Subject 的所有交互都会委托给 SecurityManager;可以把 Subject 认为是一个门面;SecurityManager 才是实际的执行者;
e.g.

 Subject currentUser = SecurityUtils.getSubject();try {currentUser.login(new UsernamePasswordToken(username, password));}

(username和password就是前端传过来的用户名和密码)
在你的controller代码中直接这样写,shiro就可以帮我们完成登录验证和授权了。
login方法的实现是这样的:

public void login(AuthenticationToken token) throws AuthenticationException {this.clearRunAsIdentitiesInternal();Subject subject = this.securityManager.login(this, token);...... }

重点看这句话

  Subject subject = this.securityManager.login(this, token);

什么是SecurityManager?往下看
二、SecurityManager:安全管理器;即所有与安全有关的操作都会与 SecurityManager 交互;且它管理着所有 Subject;可以看出它是 Shiro 的核心,它负责与后边介绍的其他组件进行交互,如果学习过 SpringMVC,你可以把它看成 DispatcherServlet 前端控制器;
login方法最终会找到我们自己实现的Realm类:
(通过ModularRealmAuthenticator 类的doAuthenticate 方法)

  protected AuthenticationInfo doAuthenticate(AuthenticationToken authenticationToken) throws AuthenticationException {this.assertRealmsConfigured();Collection<Realm> realms = this.getRealms();return realms.size() == 1 ? this.doSingleRealmAuthentication((Realm)realms.iterator().next(), authenticationToken) : this.doMultiRealmAuthentication(realms, authenticationToken);}

到这,SecurityManager就把Subject和Realm串联起来了。
实际上是通过Authenticator 完成身份认证,而SecurityManager继承自
Authenticator ,ModularRealmAuthenticator 是其默认实现之一,它委托多个Realm验证,通过验证规则通过 AuthenticationStrategy 接口指定。这个接口又有多个实现。ModularRealmAuthenticator 默认使用 AtLeastOneSuccessfulStrategy 策略。

三、Realm:域,Shiro 从从 Realm 获取安全数据(如用户、角色、权限),就是说 SecurityManager 要验证用户身份,那么它需要从 Realm 获取相应的用户进行比较以确定用户身份是否合法;也需要从 Realm 得到用户相应的角色 / 权限进行验证用户是否能进行操作;可以把 Realm 看成 DataSource,即安全数据源。

public class MyAuthorizingRealm extends AuthorizingRealm {@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {if (principals == null) {throw new AuthorizationException("PrincipalCollection method argument cannot be null.");}MyAccount = (MyAccount) getAvailablePrincipal(principals);Integer[] roleIds = admin.getRoleIds();Set<String> roles = roleService.queryByIds(roleIds);Set<String> permissions = permissionService.queryByRoleIds(roleIds);SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();info.setRoles(roles);info.setStringPermissions(permissions);return info;}@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {UsernamePasswordToken upToken = (UsernamePasswordToken) token;String username = upToken.getUsername();String password = new String(upToken.getPassword());if (StringUtils.isEmpty(username)) {throw new AccountException("用户名不能为空");}if (StringUtils.isEmpty(password)) {throw new AccountException("密码不能为空");}List<MyAccount> adminList = adminService.findAdmin(username);if (adminList.size() == 0) {throw new UnknownAccountException("找不到用户(" + username + ")的帐号信息");}MyAccount = adminList.get(0);BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();if (!encoder.matches(password, admin.getPassword())) {throw new UnknownAccountException("找不到用户(" + username + ")的帐号信息");}return new SimpleAuthenticationInfo(admin, password, getName());}}

结束

三分钟彻底弄明白shiro原理相关推荐

  1. 云技术是什么_三分钟了解云技术的原理与发展

    什么是云技术 定义 云技术(Cloud technology)基于云计算商业模式应用的网络技术.信息技术.整合技术.管理平台技术.应用技术等的总称,可以组成资源池,按需所用,灵活便利.云计算技术将变成 ...

  2. [智能硬件] 1、三分钟看懂智能硬件原理——蓝牙防丢器制作教程(包括手机应用)...

    1 什么是智能蓝牙防丢器 所谓智能蓝牙(Smart Bluetooth)防丢器,是采用蓝牙技术专门为智能手机设计的防丢器.其工作原理主要是通过距离变化来判断物品是否还控制在你的安全范围.主要适用于手机 ...

  3. [智能硬件] 3、三分钟看懂智能硬件原理——简易智能手环制作教程(包括炫酷手机客户端开发)...

    首先恭喜大家挺过了测试二!为什么说"挺"呢?因为测试二的难度和测试一相比有一个比较大的跳跃:首先测试一仅仅利用现有硬件模块稍加改造而DIY一个蓝牙防丢器,而测试二则要求大家具有从脑 ...

  4. 什么是分布式微服务架构?三分钟彻底弄懂什么是分布式和微服务

    一.微服务简介 1. 微服务的诞生 微服务是基于分而治之的思想演化出来的.过去传统的一个大型而又全面的系统,随着互联网的发展已经很难满足市场对技术的需求,于是我们从单独架构发展到分布式架构,又从分布式 ...

  5. 玩转单片机得弄明白DMA原理

    关注+星标公众号,不错过精彩内容 来源 | 嵌入式Linux DMA,全称Direct Memory Access,即直接存储器访问. DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和 ...

  6. 讨论:对于神经网络,不需要弄明白原理,只需要应用,是这样吗?

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 来源丨机器学习初学者 转自丨极市平台 导读 一位CV领域的硕士问: ...

  7. 对于神经网络,硕博士不需要弄明白原理,只需要应用,是这样吗?

    链接:https://www.zhihu.com/question/433274875 编辑:深度学习与计算机视觉 声明:仅做学术分享,侵删 作者:匿名用户 https://www.zhihu.com ...

  8. 3分钟弄明白JAVA三大修饰符

    3分钟弄明白JAVA三大修饰符 JAVA的三个修饰:static,final,abstract,在JAVA语言里无处不在,但是它们都能修饰什么组件,修饰组件的含义又有什么限制,总是混淆.所以来总结对比 ...

  9. ThreadLocal原理详解--终于弄明白了ThreadLocal

    ThreadLocal原理详解 在我看到ThreadLocal这个关键字的时候我是懵逼的,我觉得我需要弄明白,于是,我就利用搜索引擎疯狂查找,试图找到相关的解答,但是结果不尽人意. 首先说一下我的理解 ...

  10. 三分钟带你弄懂slot插槽——vue进阶

    文章目录 三分钟带你弄懂slot插槽--vue进阶 一.概述 程序员之死 什么是 slot插槽? 2.6.0 版本中的 slot 二.具名插槽 例子 效果图 代码 三.小惊喜 三分钟带你弄懂slot插 ...

最新文章

  1. Redis 实战笔记
  2. Web2.0时代,RSS你会用了吗?(技术实现总结)(转载)
  3. Multi-commodity Flow Problem
  4. Vue学习笔记(四)—— 前端路由
  5. html5 删除llocalstorage变量,删除存储在浏览器中的 Local Storage 数据《 HTML5:Web 存储 》...
  6. Web开发者的简历 模板
  7. 组合导航:中海达iNAV2产品描述及接口描述
  8. 从七种封装类型,看芯片封装发展史
  9. 同步与异步的详细区别
  10. 2018宁夏高考计算机类,2018宁夏高考艺术类分数线公布
  11. 华为称拥有超万项美国专利,知产政治化会摧毁创新
  12. 使用ventoy制作PE(可同时存在多个PE)——(有图文)
  13. svn 客户端重新设置用户名和密码
  14. PDF图纸怎么转换成CAD图纸
  15. 【Web API系列教程】1.3 — 实战:用ASP.NET Web API和Angular.js创建单页面应用程序(上)
  16. 以赛促练-力扣第85场双周赛以及第307场周赛
  17. 网络安全技术保障措施
  18. 前端demo逻辑系列之评分插件之弹幕
  19. 私有镜像仓库Harbor仓库v1.8.1离线安装以及生产基本使用
  20. jpg转换成pdf格式?怎么把图片jpg转换成pdf格式?

热门文章

  1. 安卓机被锁屏的6种解锁方法
  2. 【WPS】数学公式用插入打的 为什么公式显得比字体靠上
  3. 布置工作五步法,让工作布置跟高效
  4. isolation cell、levelshifter
  5. Python流程控制
  6. uview框架u-form表单校验,rules校验对象中对象的值(解决 当form属性嵌套对象时未取到值的问题)
  7. linux刚删除的文件,Linux文件误删除恢复方法
  8. Django博客项目(一)—— 注册和登录页面
  9. arXiv 注册完整过程(图文详解)
  10. vmware设置固定ip