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形式安全传递.且因为数字证书的 ...
随机推荐
- 记一次失败的StackOverflow回答
有一位同学在StackOverflow上提问,他想创建一个 Future 类,异步的实现 Future 的构造,当构造完成之后自动调用 .then 方法,执行后面的逻辑 class Features ...
- Emacs Client启动方式,在WSL像VIM一样操作
这个会判断是否启动 Emacs daemon,如果没有启动他会自己启动 alias ec='emacsclient -t -a ""' alias sec='sudo emacsc ...
- unity 实现自定义class深度拷贝 deep copy 深度复制 引用类型复制
气死我了,搜半天没有,全让序列化再反序列化,又不方便又不美观.结果自己试着一写就通,两行完事. 首先先安装Newtonsoft.Json 包,这个很常用也很简单,随便搜一下安上就行,早晚得学. 然后两 ...
- VUE16 检测数据变化的原理
部分转自:https://www.vue-js.com/topic/6129d7d661c8f900316ae37a 1 简介 Vue采用MVVM(数据驱动视图)的模式,去充当MVVM中的VM层,在数 ...
- [Windows] 微信超级管家,自动好友回复、计数、自动同意、群发、好友导出、消息日志、无限多开
[Windows] 微信超级管家,自动好友回复.计数.自动同意.群发.好友导出.消息日志.无限多开 微信超级管家是一款大神针对微信制作的工具,它的主要功能包括了自动回复.好友计数.自动同意.群发.好友 ...
- Svelte框架结合SpreadJS实现表格协同文档
SpreadJS是葡萄城结合 40 余年专业控件技术和在电子表格应用领域的经验而推出的纯前端表格控件.作为一个类Excel控件,SpreadJS如何实现当前比较流行的表格协同呢?本篇文章将简单介绍一下 ...
- java7.14
- dvwa靶场搭建
安装 root@kali:~# apt -y install apache2 mariadb-common mariadb-server php php-mysql php-gd root@kali: ...
- 微信小程序防止多次点击提交的方法
Page({ data: { lock: false }, //表单提交 submit(){ let that = this; let {lock} = that.data; if(!lock){ t ...
- 一位数左边补0,slice也可以
以下三种方法都可以返回:"09" 1.n<10 ?'0'+n:''+n 2.('0'+n).slice(-2) 3.(''+n).padStart(2,'0')