SpringBoot + Shiro + Redis + JWT 实现无状态登录
这是一篇随笔和心得,不会写入任何的一种代码。只是提供一种逻辑。
在我之后,我会发现这种逻辑尤为重要
最近在做一套通用的权限管理项目,考虑使用的是Shiro 的这个框架。认证和鉴权就是权限框架所解决的问题。
对于认证,使用默认的SecurityManager时 Shiro 采用的是将所有的Session信息写入到内存中,来维持会话信息。详情可以看 DefaultSessionManager
DefaultSessionManager 中使用的是基于内存的Session 管理机制,由于面向对象若自己定义的Session管理类继承了其中的某个Session管理类。对于类的初始化皆有调用构造器时隐式的调用父类的构造器进行先初始化
所以对于会话的管理,则转移到了如何对于内存中session的管理,单机情况下用户的注销。在调用注销后,则可以通过使内存中的session失效来实现。
但是在集群环境中并不适合。所以需要通过一种方式来将session持久化保存到一个地方便于session的管理。
这里选用的是redis 并且重写了SessionDao 并且注入容器中用于操作Session
继承并且重写SessionManager 中的GetSessionId方法, 在每次的请求头中获取某一个指定前缀的Token
如果获取不到的话 则调用父类的从Cookie中获取。
由于指定了SecurityManager 中的缓存管理器和UserRealm中的缓存管理器为Redis的CacheManage
所以在用户的登录后的信息,以及用户第一次访问需要权限的资源信息时会调用自定义realm中的授权方法,来校验用户是否有对应的权限。
而如果确定用户是否可以访问不同的权限呢? 在每一次用户获取权限信息时根据不同的业务逻辑将不同的权限字符串或者角色字符串授予指定的角色或者用户即可。
那么在更新用户的权限信息时,由于redis中的权限信息并不会被更新,所以可以对redis中的信息设置某个前缀,在对其进行授后,使其信息失效。这样被授权方,不需要重新登录。在下次访问授权资源的时候则会重新查询数据库权限。
2、第二种方法则是通过jwt 来做校验
jwt做校验的逻辑其实和上述差不多,可以把权限信息放到jwt中在用户访问的时候对其进行解密。 这样服务端则不需要来维护用户的权限信息。
shiro 关闭产生会话,则在用户登录成功后 颁发jwt 然后用户在请求中 一般是头部附带jwt信息。
在服务端获取到token后对其进行解密,然后去访问服务器的资源。
后面的话不想多说了, 某位大佬一句话说的好,就是你想什么是jwt? 它是用来解决什么问题的? 有什么好处? 有什么弊端?
SpringBoot + Shiro + Redis + JWT 实现无状态登录的更多相关文章
- JWT+Interceptor实现无状态登录和鉴权
无状态登录原理 先提一下啥是有状态登录 单台tomcat的情况下:编码的流程如下 前端提交表单里用户的输入的账号密码 后台接受,查数据库, 在数据库中找到用户的信息后,把用户的信息存放到session ...
- springboot+shiro+redis(集群redis版)整合教程
相关教程: 1. springboot+shiro整合教程 2. springboot+shiro+redis(单机redis版)整合教程 3.springboot+shiro+redis(单机red ...
- springboot+shiro+redis(单机redis版)整合教程
相关教程: 1. springboot+shiro整合教程 2. springboot+shiro+redis(集群redis版)整合教程 3.springboot+shiro+redis(单机red ...
- Spring Boot Security 整合 JWT 实现 无状态的分布式API接口
简介 JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案.JSON Web Token 入门教程 - 阮一峰,这篇文章可以帮你了解JWT的概念.本文重点讲解Spring Boo ...
- springboot+shiro+redis(单机redis版)整合教程-续(添加动态角色权限控制)
相关教程: 1. springboot+shiro整合教程 2. springboot+shiro+redis(单机redis版)整合教程 3. springboot+shiro+redis(集群re ...
- springboot security+redis+jwt+验证码 登录验证
概述 基于jwt的token认证方案 验证码 框架的搭建,可以自己根据网上搭建,或者看我博客springboot相关的博客,这边就不做介绍了.验证码生成可以利用Java第三方组件,引入 <dep ...
- shiro jwt 构建无状态分布式鉴权体系
一:JWT 1.令牌构造 JWT(json web token)是可在网络上传输的用于声明某种主张的令牌(token),以JSON 对象为载体的轻量级开放标准(RFC 7519). 一个JWT令牌的定 ...
- springboot+shiro+redis项目整合
介绍: Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码学和会话管理.使用Shiro的易于理解的API,您可以快速.轻松地获得任何应用程序,从最小的移动应用程序到最 ...
- SpringBoot+Shiro+Redis共享Session入门小栗子
在单机版的Springboot+Shiro的基础上,这次实现共享Session. 这里没有自己写RedisManager.SessionDAO.用的 crazycake 写的开源插件 pom.xml ...
- 基于JWT的无状态分布式授权【本文摘自智车芯官网】
简介 JWT是一种用于HTTP交互双方之间传递安全信息的简洁的.安全的表述性声明规范.JWT作为一个开发的标准,它定义了一种简洁的,自包含的方法用于通信双发之间以JSON形式安全传递.且因为数字证书的 ...
随机推荐
- vue中 beforeRouteLeave 生命周期函数
beforeRouteLeave需求描述在使用 element-UI的table 的时候,有这么一个需求.从一个页面切换到另一个页面,再切回来的时候,滚动条的位置不变. 需求:滚动浏览列表页,出现滚动 ...
- 【学习笔记】开源库之 - sigslot (在解决浅拷贝问题的基础上增加信号拦截功能)
前言说明 在文中<[学习笔记]开源库之 - sigslot (提供该库存在对象拷贝崩溃问题的解决方案)>已经介绍过 sigslot ,此文主要应用在实际的工作项目中时,发现会有拦截信号的需 ...
- Grafana 系列文章(十四):Helm 安装Loki
前言 写或者翻译这么多篇 Loki 相关的文章了, 发现还没写怎么安装 现在开始介绍如何使用 Helm 安装 Loki. 前提 有 Helm, 并且添加 Grafana 的官方源: helm repo ...
- 基于昇腾计算语言AscendCL开发AI推理应用
摘要:本文介绍了昇腾计算语言AscendCL的基本概念,并以示例代码的形式介绍了如何基于AscendCL开发AI推理应用,最后配以实际的操作演示说明如何编译运行应用. 本文分享自华为云社区<基于 ...
- 网络继电器的EPICS IOC搭建
http://www.corxnet.com/product/showproduct.php?id=36 https://item.taobao.com/item.htm?spm=a1z10.5-c- ...
- CentOS7一键安装RPM版LNMP(NGINX+PHP+MySQL)环境
转载:简书 CentOS7一键安装RPM版LNMP(NGINX+PHP+MySQL)环境 - 简书 (jianshu.com) (需要配置nginx.conf文件) 转载:csdn (35条消息) V ...
- 从 B 站出发,用 Chrome devTools performance 分析页面如何渲染
页面是如何渲染的?通常会得到"解析 HTML.css 合成 Render Tree,就可以渲染了"的回答.但是具体都做了些什么,却很少有人细说,我们今天就从 Chrome 的性能工 ...
- el-select 获取change点击index
<el-select> <el-option v-for="(item, index) in optionlist" @click.native ="h ...
- java-tocsv
1.依赖 <dependencies> <dependency> <groupId>org.apache.poi</groupId> <artif ...
- (五)REDIS-哨兵与集群
概念介绍: Sentinel(哨兵)是Redis的高可用性解决方案,主要是通过一个或多个Sentinel实例组成的Sentinel系统对任意多个主服务器以及这些主服务器的所有从服务器进行监视,当某个主 ...