一、Shiro的一些经验与rememberMe实现原理

Shiro的登录(Authorization)和验权(Authentication)。默认都是依据usernameUserName来做验证和授权的。

登录用的是UsernamePasswordTokenusernamepassword对,验权用的是PrincipalCollection身份集合(默认是username和Realm名称),有一个统一的入口就是Subject(表示一个人或其它什么的要登录进来的对象)。

关系是登陆时subject.login(token),然后登陆成功了subject里就有了subject.getPrincipal()。拿到此用户的username了。

不论什么地方都能够直接使用工具方法拿到subject: Subject subject = SecurityUtils.getSubject();

能够通过subject.isAuthenticated()为true能够推断当前用户已经登录过了;此时能够直接通过subject.getSession()去获取我们放入session的信息了。

假设subject.isRemembered()为true,则登录后,Shiro会将principal对象序列化为Byte[],再base64。加入到client的cookie里。默认过期时间为1年。用户下次訪问登录时,直接将cookie里的rememberMe数据拿出来,传到server端。Shiro就可以反序列化。还原出来原用户的身份信息。在浏览器的设置里能够查看这个base64的cookie值:

二、实现机构加username的验证

Shiro默认这一套机制都是依照username来做的。如今我们的系统里存在多个机构,不同机构能够有同样的username,那么我们怎么来实现基于机构+username的验证呢?

两个思路能够解决问题:

  1. 把机构+username拼接到一起来作为UsernamePasswordToken里的UserName
  2. 扩展UsernamePasswordToken与Principal的实现

这两个思路各有利弊。第一个比較简单粗暴,第二个比較规范通用。

因为我们是先做好基于UserName的实现以后再修改代码实现把机构扩展进去,所以第一种方式修改最小:

  1. 系统登录页面表单加上机构类型与机构名称选择,
  2. 后台把机构类型+机构id+username拼接成admin:1:3的形式,作为UsernamePasswordToken的Username,
  3. Realm实现使用自己定义的或者我写的这个ServiceRealm(仅仅有3个类),SQL改成依据机构id+username获取password
  4. 然后使用subject.login登录就可以实现基于机构+用户的验证。
  5. 登录后查看subject.getPrincipal已经是admin:1:3的形式了。

另外一种以后再分析。

三、如上改动UserName格式+rememberMe造成的一个小问题

假设浏览器之前使用了rememberMe选型以后安装上面的方式改动了UserName格式(比方admin:1:3)。则由于其cookie有效期为1年。每次再自己主动登录诗、从client提交上来的序列化的cookie数据里都是旧的数据。还原出来的principal还是老的格式(比方admin),造成了数据不一致,程序运行出错。

解决的方法:清空浏览器的cookie,或者直接强制client使用一次login登录就可以。

shiro实现基于机构加username的验证以及rememberMe的更多相关文章

  1. SpringBoot整合Shiro实现基于角色的权限访问控制(RBAC)系统简单设计从零搭建

    SpringBoot整合Shiro实现基于角色的权限访问控制(RBAC)系统简单设计从零搭建 技术栈 : SpringBoot + shiro + jpa + freemark ,因为篇幅原因,这里只 ...

  2. 基于jQuery实现的Ajax 验证用户名唯一性

    基于jQuery实现的Ajax 验证用户名唯一性 前端jsp页面代码 <tr> <th><span class="requiredField"> ...

  3. Spring+Shiro搭建基于Redis的分布式权限系统(有实例)

    摘要: 简单介绍使用Spring+Shiro搭建基于Redis的分布式权限系统. 这篇主要介绍Shiro如何与redis结合搭建分布式权限系统,至于如何使用和配置Shiro就不多说了.完整实例下载地址 ...

  4. 使用 Shiro 设计基于用户、角色、权限的通用权限管理系统

    一.前言 在大型的信息管理系统中,经常涉及到权限管理系统 下面来个 demo,很多复杂的系统的设计都来自它 代码已经放到github上了,地址:https://github.com/larger5/s ...

  5. asp.net中使用基于角色role的Forms验证

    http://www.cnblogs.com/yao/archive/2006/06/24/434783.html asp.net中使用基于角色role的Forms验证,大致经过几下四步:1.配置系统 ...

  6. shiro实战系列(五)之Authentication(身份验证)

    建议学习shiro读读官方文档,虽然不一定读的懂,但是建议要大致浏览,心中有个大概,这样对于学习还是有一定帮助 官网地址:https://shiro.apache.org/ Authenticatio ...

  7. [WCF安全3]使用wsHttpBinding构建基于SSL与UserName授权的WCF应用程序

    上一篇文章中介绍了如何使用wsHttpBinding构建UserName授权的WCF应用程序,本文将为您介绍如何使用wsHttpBinding构建基于SSL的UserName安全授权的WCF应用程序. ...

  8. 在ASP.NET Web API 2中使用Owin基于Token令牌的身份验证

    基于令牌的身份验证 基于令牌的身份验证主要区别于以前常用的常用的基于cookie的身份验证,基于cookie的身份验证在B/S架构中使用比较多,但是在Web Api中因其特殊性,基于cookie的身份 ...

  9. WebApi基于Token和签名的验证

    最近一段时间在学习WebApi,涉及到验证部分的一些知识觉得自己并不是太懂,所以来博客园看了几篇博文,发现一篇讲的特别好的,读了几遍茅塞顿开(都闪开,我要装逼了),刚开始读有些地方不理解,所以想了很久 ...

随机推荐

  1. Eclipse 工具下Maven 项目的快速搭建

    Eclipse 工具下Maven 项目的搭建 参考博文:https://www.cnblogs.com/iflytek/p/7096481.html 什么是Maven项目 简单来说,传统的Web项目: ...

  2. hdu 4451 Dressing 排列组合/水题

    Dressing Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  3. 处理 CALayer 变形后的抗锯齿问题

    处理锯齿当然要用抗锯齿,iOS 可以通过修改 Plist 实现全局抗锯齿,但是这样容易出现性能问题. 所以就要使用对单个 Layer 开启抗锯齿的方法 layer.allowsEdgeAntialia ...

  4. jquery 图片预加载

    /图片无序预加载 (function($){ function Preload(imgs,fns){ this.imgs=(typeof imgs==="string")?[img ...

  5. 【scrapy】使用方法概要(二)(转)

    [请初学者作为参考,不建议高手看这个浪费时间] 上一篇文章里介绍了scrapy的主要优点及linux下的安装方式,此篇文章将简要介绍scrapy的爬取过程,本文大部分内容源于scrapy文档,翻译并加 ...

  6. 国产Linux滋生腐败

    回想过去,2002年12月11日至12日,信息产业部与科技部联合主办"Linux软件与应用猜測研讨会".影响中国IT业的重要人士,包含政府决策者.学界权威.主要Linux推动厂商等 ...

  7. C#中List<T>是怎么存放元素的

    Jeffrey Zhao在"你的字典里有多少元素?"一文中,提到了他在面试时问过的一个问题:List<T>是怎么存放元素?不幸的是,自己也回答不出来,只知道怎么用,却不 ...

  8. Windows 7 卸载 IE10

    今天微软为Windows 7发布了IE10预览版,你是否已经安装?根据笔者的体验,IE10确实如微软所说,在速度.性能等各方面都有了明显提升. 不过,IE10发布预览版安装后会直接替代IE9,如果你想 ...

  9. quartz 中JobExecutionContext的使用

    假如execute方法中需要一些额外的数据怎么办?比如说execute 中希望发送一封邮件,但是我需要知道邮件的发送者.接收者等信息? 存在两种解决方案: 1.JobDataMap类:    每个Jo ...

  10. [MAC OS] NSOpenPanel 使用

    Mac OS开启沙盒之后,文件的保存会涉及到一个权限问题.如下图,在Capabilities中,可以勾选的权限一共有5种. User Selected File 必须勾选,否则 NSOpenPanel ...