热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

shrio验证cookie有效性

shrio验证cookie有效性概述shrio中提供cookie管理的功能,当用户选择了rememberMe,则下次不需要再登录,而是直接通过本地记录的cookie进行验证,然后就可以

shrio验证COOKIE有效性

概述

shrio中提供COOKIE管理的功能,当用户选择了rememberMe,则下次不需要再登录,而是直接通过本地记录的COOKIE进行验证,然后就可以访问权限为user的页面。

问题

shiro提供清除用户权限的功能,但是那是在代码中动态控制的,你修改了某个用户的权限,可以调用clearCachedAuthorizationInfo(principals)清除权限信息。但是如果是直接改了数据库里的信息(虽然按道理不应该出这种套路),那么它取COOKIE的时候就不会再验证,不验证用户名密码是否正确,不验证用户里的信息是否有变化。

流程

shiro中解析客户端发来的COOKIE其实主要就是调用AbstractRememberMeManager中的getRememberedPrincipals():

public PrincipalCollection getRememberedPrincipals(SubjectContext subjectContext) {
PrincipalCollection principals = null;

try {
byte[] re = this.getRememberedSerializedIdentity(subjectContext);
if(re != null && re.length > 0) {
principals = this.convertBytesToPrincipals(re, subjectContext);
}
} catch (RuntimeException var4) {
principals = this.onRememberedPrincipalFailure(var4, subjectContext);
}

return principals;
}

COOKIERememberMeManager中实现了抽象方法getRememberedSerializedIdentity():

protected byte[] getRememberedSerializedIdentity(SubjectContext subjectContext) {
if(!WebUtils.isHttp(subjectContext)) {
if(log.isDebugEnabled()) {
String wsc1 = "SubjectContext argument is not an HTTP-aware instance. This is required to obtain a servlet request and response in order to retrieve the rememberMe COOKIE. Returning immediately and ignoring rememberMe operation.";
log.debug(wsc1);
}

return null;
} else {
WebSubjectContext wsc = (WebSubjectContext)subjectContext;
if(this.isIdentityRemoved(wsc)) {
return null;
} else {
HttpServletRequest request = WebUtils.getHttpRequest(wsc);
HttpServletResponse respOnse= WebUtils.getHttpResponse(wsc);
String base64 = this.getCOOKIE().readValue(request, response);
if("deleteMe".equals(base64)) {
return null;
} else if(base64 != null) {
base64 = this.ensurePadding(base64);
if(log.isTraceEnabled()) {
log.trace("Acquired Base64 encoded identity [" + base64 + "]");
}

byte[] decoded = Base64.decode(base64);
if(log.isTraceEnabled()) {
log.trace("Base64 decoded byte array length: " + (decoded != null?decoded.length:0) + " bytes.");
}

return decoded;
} else {
return null;
}
}
}
}

主要就是进行解密,然后再返回去convertBytesToPrincipals()

解决方案

熟悉了大致的流程,应该可以想到一个解决方案。就是继承CookirRememberMeManager,重写getRememberedPrincipals()

public class MyRememberMeManager extends COOKIERememberMeManager {
@Autowired
LoginService loginService;
@Override
public PrincipalCollection getRememberedPrincipals(SubjectContext subjectContext) {
PrincipalCollection principals = super.getRememberedPrincipals(subjectContext);
if(null == principals)
return null;
User loginUser = (User) principals.getPrimaryPrincipal();
User checkUser = loginService.check(loginUser.getUsername(), loginUser.getPassword());
if(null == checkUser)
return null;
loginUser.setLevel(checkUser.getLevel());
loginUser.setCounty(checkUser.getCounty());
loginUser.setCity(checkUser.getCity());
loginUser.setTown(checkUser.getTown());
loginUser.setVillage(checkUser.getVillage());
loginUser.setDescription(checkUser.getDescription());
return principals;
}
}

推荐阅读
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • adfs是什么_培训与开发的概念
    adfs是什么_培训与开发的概念(如您转载本文,必须标明本文作者及出处。如有任何疑问请与我联系me@nap7.com)ADFS相关开发技术的中文资料相对匮乏,之前在弄这个东西的时候 ... [详细]
  • 渗透测试基础bypass绕过阻挡我们的WAF(下)
    渗透测试基础-bypass ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
author-avatar
手机用户2602884633
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有