SpringSecurity中文文档(Servlet RememberMe)

Remember-Me Authentication

Remember-me 或持久登录身份验证指的是网站能够在会话之间记住主体的标识。这通常是通过向浏览器发送 Cookie 来完成的,Cookie 将在以后的会话中被检测到,并导致自动登录的发生。Spring Security 为这些操作提供了必要的钩子,并且有两个具体的 remember-me 实现。一种方法使用哈希来保护基于 cookie 的令牌的安全性,另一种方法使用数据库或其他持久存储机制来存储生成的令牌。

请注意,这两种实现都需要一个UserDetailsService。如果您使用的身份验证提供者不使用UserDetailsService(例如,LDAP提供者),那么除非您的应用程序上下文中也包含一个UserDetailsService bean,否则它将无法工作。

Simple Hash-Based Token Approach

这种方法使用哈希来实现一个有用的“记住我”策略。本质上,在成功的交互式身份验证后,一个cookie会被发送到浏览器,该cookie的构成如下:

base64(username + ":" + expirationTime + ":" + algorithmName + ":"
algorithmHex(username + ":" + expirationTime + ":" password + ":" + key))username:          As identifiable to the UserDetailsService
password:          That matches the one in the retrieved UserDetails
expirationTime:    The date and time when the remember-me token expires, expressed in milliseconds
key:               A private key to prevent modification of the remember-me token
algorithmName:     The algorithm used to generate and to verify the remember-me token signature

“记住我”令牌仅在指定的有效期内有效,且仅当用户名、密码和密钥没有更改时才有效。值得注意的是,这存在一个潜在的安全问题,即捕获的“记住我”令牌可以在令牌过期之前的任何用户代理上使用。这与摘要认证的问题相同。如果主体意识到令牌已被捕获,他们可以轻松更改密码,并立即使所有“记住我”令牌无效。如果需要更高的安全性,您应该使用下一节中描述的方法。或者,根本不应使用“记住我”服务。

如果您熟悉本章中讨论的命名空间配置主题,您可以通过添加 元素来启用“记住我”身份验证:

<http>
...
<remember-me key="myAppKey"/>
</http>

UserDetailsService 通常会自动选择。如果您在应用程序上下文中有多个 UserDetailsService,则需要使用 user-service-ref 属性指定应该使用哪一个,其中的值是您的 UserDetailsService bean 的名称。

Persistent Token Approach

这种方法基于文章《改进的持久登录Cookie最佳实践》 [1] 并进行了一些小的修改。要使用命名空间配置这种方法,您需要提供一个数据源引用:

<http>
...
<remember-me data-source-ref="someDataSource"/>
</http>

数据库应该包含一个持久化 _ login 表,该表是通过使用以下 SQL (或等效 SQL)创建的:

create table persistent_logins (username varchar(64) not null,series varchar(64) primary key,token varchar(64) not null,last_used timestamp not null)

Remember-Me Interfaces and Implementations

“记住我”功能与 UsernamePasswordAuthenticationFilter 一起使用,并通过 AbstractAuthenticationProcessingFilter 超类中的钩子实现。它也在 BasicAuthenticationFilter 中使用。这些钩子在适当的时候调用一个具体的 RememberMeServices。以下列表显示了该接口:

Authentication autoLogin(HttpServletRequest request, HttpServletResponse response);void loginFail(HttpServletRequest request, HttpServletResponse response);void loginSuccess(HttpServletRequest request, HttpServletResponse response,Authentication successfulAuthentication);

请参阅 RememberMeServices 的 Javadoc 以获得关于方法功能的更全面讨论,尽管请注意,在这个阶段,AbstractAuthenticationProcessingFilter 只调用 loginFail() 和 loginSuccess() 方法。autoLogin() 方法由 RememberMeAuthenticationFilter 在 SecurityContextHolder 不包含 Authentication 时调用。因此,这个接口为底层“记住我”实现提供了足够的认证相关事件通知,并且每当一个候选的 web 请求可能包含一个 cookie 并希望被记住时,就会委托给实现。这种设计允许任意数量的“记住我”实现策略。

我们之前已经看到,Spring Security 提供了两种实现。我们逐一查看这些实现。

TokenBasedRememberMeServices

这个实现支持之前描述的简单基于哈希的令牌方法。TokenBasedRememberMeServices 生成一个 RememberMeAuthenticationToken,该令牌由 RememberMeAuthenticationProvider 处理。这个身份验证提供者和 TokenBasedRememberMeServices 之间共享一个密钥。此外,TokenBasedRememberMeServices 需要 一个 UserDetailsService,从中它可以检索用户名和密码以用于签名比较目的,并生成包含正确 GrantedAuthority 实例的 RememberMeAuthenticationToken。TokenBasedRememberMeServices 还实现了 Spring Security 的 LogoutHandler 接口,因此它可以与 LogoutFilter 一起使用,以自动清除 cookie。

默认情况下,这个实现使用 SHA-256 算法来编码令牌签名。为了验证令牌签名,将从 algorithmName 检索到的算法进行解析并使用。如果没有提供 algorithmName,将使用默认的匹配算法,即 SHA-256。您可以分别为签名编码和签名匹配指定不同的算法,这允许用户在仍然能够验证没有 algorithmName 的旧令牌的情况下,安全地升级到不同的编码算法。为此,您可以指定自定义的 TokenBasedRememberMeServices 作为 Bean,并在配置中使用它。

@Bean
SecurityFilterChain securityFilterChain(HttpSecurity http, RememberMeServices rememberMeServices) throws Exception {http.authorizeHttpRequests((authorize) -> authorize.anyRequest().authenticated()).rememberMe((remember) -> remember.rememberMeServices(rememberMeServices));return http.build();
}@Bean
RememberMeServices rememberMeServices(UserDetailsService userDetailsService) {RememberMeTokenAlgorithm encodingAlgorithm = RememberMeTokenAlgorithm.SHA256;TokenBasedRememberMeServices rememberMe = new TokenBasedRememberMeServices(myKey, userDetailsService, encodingAlgorithm);rememberMe.setMatchingAlgorithm(RememberMeTokenAlgorithm.MD5);return rememberMe;
}

应用程序上下文中需要以下 bean 来启用 remember-me 服务:

@Bean
RememberMeAuthenticationFilter rememberMeFilter() {RememberMeAuthenticationFilter rememberMeFilter = new RememberMeAuthenticationFilter();rememberMeFilter.setRememberMeServices(rememberMeServices());rememberMeFilter.setAuthenticationManager(theAuthenticationManager);return rememberMeFilter;
}@Bean
TokenBasedRememberMeServices rememberMeServices() {TokenBasedRememberMeServices rememberMeServices = new TokenBasedRememberMeServices();rememberMeServices.setUserDetailsService(myUserDetailsService);rememberMeServices.setKey("springRocks");return rememberMeServices;
}@Bean
RememberMeAuthenticationProvider rememberMeAuthenticationProvider() {RememberMeAuthenticationProvider rememberMeAuthenticationProvider = new RememberMeAuthenticationProvider();rememberMeAuthenticationProvider.setKey("springRocks");return rememberMeAuthenticationProvider;
}

请记得将您的 RememberMeServices 实现添加到您的 UsernamePasswordAuthenticationFilter.setRememberMeServices() 属性中,将 RememberMeAuthenticationProvider 包含在您的 AuthenticationManager.setProviders() 列表中,并在您的 FilterChainProxy 中添加 RememberMeAuthenticationFilter(通常紧随您的 UsernamePasswordAuthenticationFilter 之后)。

PersistentTokenBasedRememberMeServices

您可以按照与 TokenBasedRememberMeServices 相同的方式使用该类,但是它还需要配置一个 PersisentTokenRepository 来存储令牌。

  • InMemoryTokenRepositoryImpl which is intended for testing only.
  • JdbcTokenRepositoryImpl which stores the tokens in a database.

有关数据库架构,请参见持久性令牌方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/39156.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RS232、RS485与RS422初步学习

目录 电平 传输方式 共模和差模干扰 ps&#xff1a;双绞线 485总线结构 ps&#xff1a;终端电阻 RS232接口&#xff08;DB9&#xff09; 优缺点 RS232优缺点 RS485较RS232的优点 为什么RS232还在使用&#xff1f; 电平 RS232、RS485与RS422的电平 区间逻辑备注RS232…

巧用Fiddler中的Comments提升接口测试效率

有没有同学在使用Fiddler时跟我遇到了同样的问题&#xff0c;就是想给某个抓包的请求进行注释&#xff01;&#xff01;&#xff01;但是奇怪的是&#xff0c;根本没有Comments相关信息呀&#xff1f; 设置Comments 设置Comments非常容易&#xff0c;选中一个请求&#xff0c…

基于ESP32 IDF的WebServer实现以及OTA固件升级实现记录(一)

webserver即运行在esp32上的web服务&#xff0c;相当于esp32作为web服务器&#xff0c;它可以处理web浏览器等客户端的http相关请求&#xff08;常见的get/post/put等http方法&#xff09;。 ota即在线固件升级&#xff0c;idf已经提供了丰富的官方ota示例&#xff0c;不过主要…

mybatis多数据源操作

最近项目&#xff0c;一个后端代码被两个前端页面调用&#xff0c;代码数据库都冗余了&#xff0c;写着很难受感觉跟吃狗屎一样。因此决定先把数据库分开&#xff0c;然后之后把项目分成多模块化得。 想把数据库分开其实就只是需要实现多数据源操作&#xff0c;我考虑得不多&a…

DSPy的BootstrapFewShot

这是官方文档 官方文档给示例数据的量划分了10/50/300等档位&#xff0c;对应BootstrapFewShot/BootstrapFewShotWithRandomSearch/MIPRO. 我们以10条示例数据example为例&#xff0c;即选用BootstrapFewShot DSPy认为用原始数据直接做few-shot效果不好的原因是&#xff1a;…

Golang-context理解

golang-context笔记整理 golang为何设计context&#xff1f;代码上理解原理空context类cancelCtx类.withcancelctx方法 timerCtx类valueCtx类 golang为何设计context&#xff1f; 有并发特性的语言中&#xff0c;都会有一种说法&#xff1a;创建异步线程或者携程的时候&#x…

【TS】TypeScript 入门指南:强大的JavaScript超集

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 TypeScript 入门指南&#xff1a;强大的JavaScript超集一、TypeScript 简介1.1 …

Windows页面错误(Page Fault)写几种c++会导致,此问题的例子

在C中&#xff0c;直接导致Windows页面错误&#xff08;Page Fault&#xff09;的情景较少直接由编程错误引发&#xff0c;页面错误更多是由操作系统在内存管理和虚拟内存机制中处理的。不过&#xff0c;某些编程错误可能导致访问违规&#xff0c;进而间接引起操作系统报告页面…

SpringBoot实现图片添加水印(完整)

提示&#xff1a;昨天不是写了一个类似与图片添加水印的版本吗,今天来写一个带数据库&#xff0c;并且可以完整访问的版本 文章目录 目录 文章目录 引入库 配置文件 数据库配置 字段配置 索引配置 数据库表语句 启动文件 前端代码 整体代码目录 配置类AppConfig Contro…

通俗大白话理解Docker

什么是Docker Docker本质上是一种容器化技术&#xff0c;用于将应用程序及其所有依赖打包到一个标准化的单元中。这些单元&#xff08;容器&#xff09;可以在任何运行Docker的机器上运行。每个容器是相互隔离的&#xff0c;具有自己的文件系统、网络和进程空间。 以下是大白话…

gin框架中form, uri 2种类型的数据绑定到自定义结构体, 绑定数据默认值设置方法, 时间格式绑定和格式设置 详解

gin框架中可以非常方便的将http请求的form数据&#xff0c;和路由参数中的uri 数据通过反射的方式将我们自定义在结构体中的TAG字段和请求参数中同名的数据进行绑定。 要完成数据的绑定&#xff0c; 首先我们需要定义一个结构体和需要绑定的结构体字段&#xff0c;并在结构体字…

用可视化的方式学统计学

本次分享一个统计学学习工具:看见统计。 看见统计致力于用数据可视化 (使用D3.js完成) 让统计概念更容易理解,源于布朗大学几位作者👇 看见统计共有6个章节, 下面来看看具体内容, 中心极限定理 对于一个(性质比较好的)分布,如果我们有足够大的独立同分布的样本,其…

Java高级重点知识点-19-Lambda

文章目录 Lambda表达式函数式编程思想Lambda表达式写法代码讲解 Lambda表达式 函数式编程思想 强调做什么&#xff0c;而不是以什么形式做。 以函数式接口Runnable为例讲解&#xff1a; public class LambdaDemo {public static void main(String[] args) {Runnable runnab…

C语言实现简单的minishell

探索开源项目&#xff1a;MiniShell 引言 在计算机编程的世界里&#xff0c;Shell 是一个至关重要的组成部分&#xff0c;它允许用户与操作系统交互&#xff0c;执行命令和程序。MiniShell 是一个简化版的 Shell 程序&#xff0c;通常用于教学和学习目的。在本文中&#xff0…

第3篇 区块链技术的核心要素:共识机制、加密技术与分布式账本

区块链听起来像个非常高大上的技术&#xff0c;其实它的核心原理并不难理解。今天我们要聊的就是区块链的三个核心要素&#xff1a;共识机制、加密技术和分布式账本。想象一下区块链是一个巨大的数字笔记本&#xff0c;我们要弄清楚大家如何共同写这个笔记本&#xff0c;又如何…

《梦醒蝶飞:释放Excel函数与公式的力量》8.2 COUNTA函数

8.2 COUNTA函数 COUNTA函数是Excel中用于统计指定区域内所有非空单元格数量的函数。它能够统计数值、文本、错误值以及公式返回的结果&#xff0c;是数据分析中常用的统计工具。 8.2.1 函数简介 COUNTA函数用于统计指定区域中所有非空单元格的数量。它与COUNT函数不同&#…

创新校园服务模式 跑腿小程序平台源码构建与实践 前后端分离 带完整的安装代码包以及部署教程

系统概述 本项目是一个集任务发布、接单、支付、评价于一体的跑腿服务小程序平台&#xff0c;专为高校校园设计。系统采用前后端分离架构&#xff0c;前端负责用户界面展示和交互逻辑&#xff0c;后端处理业务逻辑、数据存取等&#xff0c;两者通过API接口进行通信&#xff0c…

二叉树的右视图-二叉树

199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 层序遍历&#xff0c;广度优先 queue先进后出&#xff0c;每层从左往右进树&#xff0c;最后一个就是最右边的数&#xff1b;pop掉这层的。push下一层&#xff1b; class Solution { public:vector<int> r…

楼层分户项目分析

文章目录 1. 区域绘制2. 户型切分3. 楼房分层4. 编辑房户信息5. 查看房户信息6. 数据库6.1. 楼栋数据库6.2. 单位数据库 7. 房户数据库 1. 区域绘制 点击绘制图形&#xff0c;激活画笔&#xff0c;右键结束绘制。 输入框可以更换地址前缀。 分户坐标是由绘制的多个点组成的&…

深度学习笔记: 最详尽解释混淆矩阵 Confusion Matrix

欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家&#xff01; 混淆矩阵 假设我们有包含临床测量数据的医疗数据&#xff0c;例如胸痛、良好的血液循环、动脉阻塞和体重…