一、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. Python168的学习笔记3

    list.extend(),可以拓展list,a=(0,1),b=(2,3) a.extend(b),a就变成(0,1,2,3) 分割字符串(除去字符串中的,\/;之类的),如果用str.split( ...

  2. 216. 组合总和 III

    216. 组合总和 III 题意 找出所有相加之和为 n 的 k 个数的组合.组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字. 说明: 所有数字都是正整数. 解集不能包含重复的 ...

  3. redis学习之一 - linux下安装配置

    Content 0.序 1.如何安装? 2.配置参数及其意义 3.设为linux服务 0.序 本文主要是记录Redis在 Centos下的安装配置 .文中如无特别说明.表示redis-3.2.10代码 ...

  4. MySQL Proxy 实现MySQLDB 读写分离

    一.简述 MySQL Proxy是一个处于你的client端和MySQL server端之间的简单程序,它可以监测.分析或改变它们的通信.它使用灵活,没有限制,常见的用途包括:负载平衡,故障.查询分析 ...

  5. 三个实例演示 Java Thread Dump 日志分析(转)

    原文链接:http://www.cnblogs.com/zhengyun_ustc/archive/2013/01/06/dumpanalysis.html 转来当笔记^_^ jstack Dump ...

  6. Oracle 12c on Solaris 10 安装文档

    http://www.orasql.com/blog/archives/2013/08/20/12c_solaris.htm

  7. linux strace追踪mysql执行语句 (mysqld --debug)

    转载请注明出处:使用strace追踪多个进程 http://www.ttlsa.com/html/1841.html http://blog.itpub.net/26250550/viewspace- ...

  8. linux 内核大牛-谢宝友

    http://blog.chinaunix.net/uid/25845340.html 谢宝友:毕业于四川省税务学校税收专业,现供职于中兴通讯操作系统团队,对操作系统内核有较强的兴趣.专职于操作系统内 ...

  9. svn如何提取文件更新列表

    eclipse svn插件site-1.10.1 Slik-Subversion-1.8.0-x64.msi  ---可以使用svn命令,如svn status 显示修改过的本地文件,如下示例: I: ...

  10. 如何使用 Core Plot 的 API 帮助文档

    Core Plot 可是 iOS 下绝好的图表组件,虽说它的相关资料不甚丰富,特别是中文的,英文的还是有几篇不错的文章,不过 Core Plot 自身提供的 API 帮助文档,以及代码示例其实很有用的 ...