认证授权基础概念详解
目录
RBAC 模型了解吗?
如何在 Spring Boot 中创建和读取 Cookie
安全 Cookie
总结
这是一个绝大多数人都会混淆的问题。首先先从读音上来认识这两个名词,很多人都会把它俩的读音搞混,所以我建议你先先去查一查这两个单词到底该怎么读,他们的具体含义是什么。
说简单点就是:
- 认证 (Authentication): 你是谁。
- 授权 (Authorization): 你有权限干什么。
稍微正式点(啰嗦点)的说法就是:
- Authentication(认证) 是验证您的身份的凭据(例如用户名/用户 ID 和密码),通过这个凭据,系统得以知道你就是你,也就是说系统存在你这个用户。所以,Authentication 被称为身份/用户验证。
- Authorization(授权) 发生在 Authentication(认证) 之后。授权嘛,光看意思大家应该就明白,它主要掌管我们访问系统的权限。比如有些特定资源只能具有特定权限的人才能访问比如 admin,有些对系统资源操作比如删除、添加、更新只能特定人才具有。
认证:
比如像qq 我们常见的登录就都是认证
授权:
没有权限
这两个一般在我们的系统中被结合在一起使用,目的就是为了保护我们系统的安全性。
RBAC 模型了解吗?
系统权限控制最常采用的访问控制模型就是 RBAC 模型 。
什么是 RBAC 呢? RBAC 即基于角色的权限访问控制(Role-Based Access Control)。这是一种通过角色关联权限,角色同时又关联用户的授权的方式。
简单地说:一个用户可以拥有若干角色,每一个角色又可以被分配若干权限,这样就构造成“用户-角色-权限” 的授权模型。在这种模型中,用户与角色、角色与权限之间构成了多对多的关系。
在 RBAC 权限模型中,权限与角色相关联,用户通过成为包含特定角色的成员而得到这些角色的权限,这就极大地简化了权限的管理。
为了实现 RBAC 权限模型,数据库表的常见设计如下(一共 5 张表,2 张用户建立表之间的联系):
通过这个权限模型,我们可以创建不同的角色并为不同的角色分配不同的权限范围(菜单)。
通常来说,如果系统对于权限控制要求比较严格的话,一般都会选择使用 RBAC 模型来做权限控制。
什么是 Cookie ? Cookie 的作用是什么?
Cookie
和 Session
都是用来跟踪浏览器用户身份的会话方式,但是两者的应用场景不太一样。
维基百科是这样定义 Cookie
的:
Cookies
是某些网站为了辨别用户身份而储存在用户本地终端上的数据(通常经过加密)。
简单来说:Cookie
存放在客户端,一般用来保存用户信息。
下面是 Cookie
的一些应用案例:
- 我们在
Cookie
中保存已经登录过的用户信息,下次访问网站的时候页面可以自动帮你登录的一些基本信息给填了。除此之外,Cookie
还能保存用户首选项,主题和其他设置信息。 - 使用
Cookie
保存SessionId
或者Token
,向后端发送请求的时候带上Cookie
,这样后端就能取到Session
或者Token
了。这样就能记录用户当前的状态了,因为 HTTP 协议是无状态的。 Cookie
还可以用来记录和分析用户行为。举个简单的例子你在网上购物的时候,因为 HTTP 协议是没有状态的,如果服务器想要获取你在某个页面的停留状态或者看了哪些商品,一种常用的实现方式就是将这些信息存放在Cookie
- ……
如何在项目中使用 Cookie 呢?
我这里以 Spring Boot 项目为例。
)设置 Cookie
返回给客户端
@GetMapping("/change-username")
public String setCookie(HttpServletResponse response) {// 创建一个 cookieCookie cookie = new Cookie("username", "Jovan");//设置 cookie过期时间cookie.setMaxAge(7 * 24 * 60 * 60); // expires in 7 days//添加到 response 中response.addCookie(cookie);return "Username is changed!";
}
2) 使用 Spring 框架提供的 @CookieValue
注解获取特定的 cookie 的值
@GetMapping("/login")
public String readCookie(@CookieValue(value = "username", defaultValue = "Atta") String username) {return "Hey! My username is " + username;
}
3) 读取所有的 Cookie
值
@GetMapping("/all-cookies")
public String readAllCookies(HttpServletRequest request) {Cookie[] cookies = request.getCookies();if (cookies != null) {return Arrays.stream(cookies).map(c -> c.getName() + "=" + c.getValue()).collect(Collectors.joining(", "));}return "No cookies";
}
如何在 Spring Boot 中创建和读取 Cookie
创建 Cookie
要在 Spring Boot 中设置 cookie,我们可以使用类中的方法。您需要做的就是创建一个新实例并将其添加到响应中,如下所示:addCookie()
HttpServletResponse
Cookie
@GetMapping("/change-username")
public String setCookie(HttpServletResponse response) {// create a cookieCookie cookie = new Cookie("username", "Jovan");//add a cookie to the responseresponse.addCookie(cookie);return "Username is changed!";
}
Cookie 到期日期
如果没有为 Cookie 指定过期时间,则只要会话未过期,它就会持续存在。此类 Cookie 称为会话 Cookie。会话 Cookie 将保持活动状态,直到用户关闭浏览器或清除 Cookie。上面创建的 cookie 实际上是会话 cookie。username
但是你可以覆盖这个默认行为,并使用类的方法设置 cookie 过期时间:setMaxAge()
Cookie
// create a cookie
Cookie cookie = new Cookie("username", "Jovan");
cookie.setMaxAge(7 * 24 * 60 * 60); // expires in 7 days//add a cookie to the response
response.addCookie(cookie);
现在,cookie 将在接下来的 7 天内保持活动状态,而不是在浏览器关闭时过期。在指定日期和时间过期的 Cookie 称为永久 Cookie。username
注意:传递给 method 的过期时间以秒为单位。到期日期和时间是相对于设置 Cookie 的客户端(而不是服务器)的。
setMaxAge()
安全 Cookie
安全 Cookie 仅通过加密的 HTTPS 连接发送到服务器。安全 Cookie 无法通过未加密的 HTTP 连接传输到服务器。
要制作 cookie ,请使用以下方法:
// create a cookie
Cookie cookie = new Cookie("username", "Jovan");
cookie.setMaxAge(7 * 24 * 60 * 60); // expires in 7 days
cookie.setSecure(true);//add a cookie to the response
response.addCookie(cookie);
HttpOnly 安全特性
浏览器中的是什么:
HttpOnly标志是一个安全特性,由服务器通过设置在HTTP响应头中的Set-Cookie字段来启用。启用后,它告诉浏览器这个特定的Cookie应该对客户端的JavaScript代码不可访问
,以
防止例如跨站脚本(XSS)的攻击者通过脚本窃取Cookie信息
。虽然HttpOnly不是全面防护措施,但它显著增加了攻击者盗取用户会话的难度。
如果为 Cookie 设置了该属性,则客户端脚本无法访问该属性。例如,您不能使用 property 访问 JavaScript 中的 Cookie。
// create a cookie
Cookie cookie = new Cookie("username", "Jovan");
cookie.setMaxAge(7 * 24 * 60 * 60); // expires in 7 days
cookie.setSecure(true);
cookie.setHttpOnly(true);//add a cookie to the response
response.addCookie(cookie);
这是保护 cookie 不被恶意代码或跨站点脚本 (XSS) 攻击更改的一种方法。
Cookie 路径
该属性指定应将 Cookie 发送到服务器的 URL 路径。默认情况下,如果未指定路径,则仅将 Cookie 发送到用于在浏览器中设置该 URL 的服务器。Path
您可以使用该方法为 cookie 设置指令:setPath()
// create a cookie
Cookie cookie = new Cookie("username", "Jovan");
cookie.setMaxAge(7 * 24 * 60 * 60); // expires in 7 days
cookie.setSecure(true);
cookie.setHttpOnly(true);
cookie.setPath("/"); // global cookie accessible every where//add a cookie to the response
response.addCookie(cookie);
通过显式设置该指令,cookie 将被传送到指定的 URL 及其所有子目录。Path
读取 Cookie
Spring 框架提供 Comments 来获取任何 HTTP cookie 的值,而无需迭代从请求中获取的所有 cookie。此 Comments 可用于将 cookie 的值映射到控制器方法参数:@CookieValue
@GetMapping("/")
public String readCookie(@CookieValue(value = "username", defaultValue = "Atta") String username) {return "Hey! My username is " + username;
}
在上面的代码片段中,请注意 .如果未设置默认值,则 Spring 将在 HTTP 请求中找不到具有该名称的 cookie 时引发异常。defaultValue = "Atta"
java.lang.IllegalStateException
username
读取所有 Cookie
除了使用注解,我们还可以将类用作控制器方法参数来读取所有 cookie。此类提供了将浏览器发送的所有 Cookie 作为 .@CookieValue
HttpServletRequest
getCookies()
Cookie
@GetMapping("/all-cookies")
public String readAllCookies(HttpServletRequest request) {Cookie[] cookies = request.getCookies();if (cookies != null) {return Arrays.stream(cookies).map(c -> c.getName() + "=" + c.getValue()).collect(Collectors.joining(", "));}return "No cookies";
}
删除 Cookie
要删除 Cookie,您需要创建具有相同名称和指令 to 的类的新实例,然后再次将其添加到响应中,如下所示:Cookie
Max-Age
0
// create a cookie
Cookie cookie = new Cookie("username", null);
cookie.setMaxAge(0);
cookie.setSecure(true);
cookie.setHttpOnly(true);
cookie.setPath("/");//add a cookie to the response
response.addCookie(cookie);
总结
Cookie 提供了一种在服务器和浏览器之间交换信息的方法,以管理会话(登录、购物车、游戏分数)、记住用户偏好(主题、隐私政策接受度)并跟踪整个网站的用户行为。
Spring Boot 提供了一种读取、写入和删除 HTTP cookie 的简单方法。
@CookieValue
annotation 将 cookie 的值映射到 method 参数。您应该设置默认值,以避免在 Cookie 不可用时出现运行时异常。HttpServletResponse
类可用于在浏览器中设置新的 Cookie。您只需创建一个实例并将其添加到响应中。Cookie
- 要读取所有 cookie,您可以使用 '方法,该方法返回一个数组 .
HttpServletRequest
getCookies()
Cookie
Max-Age
directive 指定 cookie 过期的日期和时间。- 如果要在 Cookie 中存储敏感信息,请确保设置 and 属性以避免 XSS 攻击。
Secure
HttpOnly
- 设置 使 Cookie 在当前域的所有位置均可访问。
Path=/
- 要删除 Cookie,请将 设置为 to 并传递您首次设置它时使用的所有属性。
Max-Age
0
相关文章:

认证授权基础概念详解
目录 认证 (Authentication) 和授权 (Authorization)的区别是什么? RBAC 模型了解吗? 什么是 Cookie ? Cookie 的作用是什么? 如何在项目中使用 Cookie 呢? 如何在 Spring Boot 中创建和读取 Cookie 创建 Cookie Cookie 到期日期 安全…...
美国地址生成器站点
推荐一:fakexy 官网地址:https://www.fakexy.com 推荐二:好维持官网地址: https://www.dizhishengcheng.com 官网除了支持生成美国地址信息外,还支持生成英国、加拿大、日朩、澳大利亚、德国、法国、意大利、西班牙、巴…...

微信4.0大版本升级跨平台支持界面全面改版
微信4.0公测版现已正式发布,作为微信的大版本升级,新版微信基于全新架构开发,跨平台支持Windows和MAC系统,界面也全面改版,聊天宝也第一时间适配微信4.0,为广大客户提供快捷回复支持 前言 微信4.0公测版现…...

不想贴秋膘?正确打开秋冬运动姿势
这个秋天想要轻装上阵,想健康入秋更要美美入冬怎么破?这期把正确打开秋冬姿势一次性告诉你哦~ 天气变凉,脂肪可要燃起来~想要无痛入秋,最重要的动起来!每天都抽出一点时间去运动一下,不光让身体燃起来&…...
【AIGC半月报】AIGC大模型启元:2024.11(上)
【AIGC半月报】AIGC大模型启元:2024.11(上) (1) Hunyuan-Large(腾讯开源大模型)(2) FLUX1.1 pro(文生图)(3) CogVideoX v1.5(智谱AI升级文生视频大模型) (1) Hunyuan-Lar…...
纯前端生成PDF(jsPDF)并下载保存或上传到OSS
前言 在工作中遇到了一个需求,就是把前端页面生成PDF并保存在本地,因为前端网站可能会展示各种表格,图表信息内容并带有比较鲜艳的色彩样式,如果让后端生产的PDF的话样式可能和前端页面展示的有所差异,所以这个任务就落…...

海外媒体发稿:旅游业媒体推广12个方面的注意事项-华媒舍
1.社交媒体推广过多 社交媒体是旅游业媒体推广的重要途径之一,过分依赖社交媒体将会成为一个常见误区。尽管社交媒体能够帮助旅行目的地提升知名度和曝光度,但如果过度投入精力与资源,可能忽视别的合理推广方式。 2.忽略SEO优化 搜索引擎提…...
分割回文串(DFS)
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串。返回 s 所有可能的分割方案。 示例 1: 输入:s "aab" 输出:[["a","a","b"],["aa","b&qu…...

Qt第三课 ----------容器类控件
作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 🎂 作者介绍: 🎂🎂 🎂 🎉🎉🎉…...
打印菱形(C语言)
程序: #include <stdio.h> int main() { int i,j; for(i1;i<5;i){ for(j0;j<6-i;j){ printf(" ");} for(j0;j<i*2-1;j){ printf("*");} printf("\n");} …...
Oracle 19c 中启用 scott 用户
Oracle 19c 中启用 scott 用户 文章目录 Oracle 19c 中启用 scott 用户正常操作如果ORA-01918: 用户 SCOTT 不存在?/sqlplus/admin/scott.sql 没有 scott.sql 怎么处理 正常操作 连接到 Oracle 数据库: 使用 sqlplus 工具或者其他 SQL 客户端工具(如 S…...

git commit 校验
commitlint官方链接 1. npm install --save-dev commitlint/config-conventional commitlint/cli 2. 配置commitlint.config.cjs(项目根目录中) module.exports {extends: [commitlint/config-conventional],rules: {type-enum: [2,always,[Feat, Fix, Doc, Style,…...

【AtCoder】Beginner Contest 377-B.Avoid Rook Attack
Problem Statement 题目链接 There is a grid of 64 64 64 squares with 8 8 8 rows and 8 8 8 columns. Let ( i , j ) (i,j) (i,j) denote the square at the i i i-th row from the top ( 1 ≤ i ≤ 8 ) (1\leq i\leq8) (1≤i≤8) and j j j-th column from the lef…...

江协科技STM32学习- P38 软件SPI读写W25Q64
🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝…...

【Triton 教程】低内存 Dropout
Triton 是一种用于并行编程的语言和编译器。它旨在提供一个基于 Python 的编程环境,以高效编写自定义 DNN 计算内核,并能够在现代 GPU 硬件上以最大吞吐量运行。 更多 Triton 中文文档可访问 →https://triton.hyper.ai/ 在本教程中,您将编…...
npx创建项目时,error fetch failed.TypeError: fetch failed
npx创建项目时,报以下错误: error fetch failed. TypeError: fetch failedat node:internal/deps/undici/undici:12345:11at process.processTicksAndRejections (node:internal/process/task_queues:95:5)at async getTemplateVersion (C:\Users\ymt30…...
《Kotlin实战》-附录
附录 本部分内容只是简单列举下Kotlin应用以便指引进一步深入学习Kotlin。 附录A:构建Kotlin项目 本节只会记录下gradle的应用,其他需要时请自行搜索查看。 A.1 用Gradle构建Kotlin代码的项目 构建Kotlin项目的标准Gradle脚本如下: bui…...

yelp数据集上识别潜在的热门商家
yelp数据集是研究B2C业态的一个很好的数据集,要识别潜在的热门商家是一个多维度的分析过程,涉及用户行为、商家特征和社区结构等多个因素。从yelp数据集里我们可以挖掘到下面信息有助于识别热门商家 用户评分和评论分析 评分均值: 商家的平均评分是反映其…...

【Linux】进程信号全攻略(一)
🌈 个人主页:Zfox_ 🔥 系列专栏:Linux 目录 一:🔥 信号的概念 二:🔥 信号产生的方式 🦋 使用键盘🦋 系统调用函数🦋 软件条件🦋 进程异…...

linux文件重命名
Linux文件重命名 文件名显示异常问题出在哪里批量改名扩展 文件名显示异常 跑测CTS,linux环境看跑测结果log file显示没问题,倘若windows下看log file名却显示异常,不太方便操作。 问题出在哪里 linux环境下文件名可以显示正常࿰…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...