当前位置: 首页 > news >正文

认证授权基础概念详解

目录

认证 (Authentication) 和授权 (Authorization)的区别是什么?

RBAC 模型了解吗?

如何在 Spring Boot 中创建和读取 Cookie

安全 Cookie

读取所有 Cookie

总结


这是一个绝大多数人都会混淆的问题。首先先从读音上来认识这两个名词,很多人都会把它俩的读音搞混,所以我建议你先先去查一查这两个单词到底该怎么读,他们的具体含义是什么。

说简单点就是:

  • 认证 (Authentication): 你是谁。
  • 授权 (Authorization): 你有权限干什么。

稍微正式点(啰嗦点)的说法就是:

  • Authentication(认证) 是验证您的身份的凭据(例如用户名/用户 ID 和密码),通过这个凭据,系统得以知道你就是你,也就是说系统存在你这个用户。所以,Authentication 被称为身份/用户验证。
  • Authorization(授权) 发生在 Authentication(认证) 之后。授权嘛,光看意思大家应该就明白,它主要掌管我们访问系统的权限。比如有些特定资源只能具有特定权限的人才能访问比如 admin,有些对系统资源操作比如删除、添加、更新只能特定人才具有。

认证:

                                         比如像qq 我们常见的登录就都是认证

 

 

授权:

没有权限

                                                                没有权限

这两个一般在我们的系统中被结合在一起使用,目的就是为了保护我们系统的安全性。

 

RBAC 模型了解吗?

系统权限控制最常采用的访问控制模型就是 RBAC 模型

什么是 RBAC 呢? RBAC 即基于角色的权限访问控制(Role-Based Access Control)。这是一种通过角色关联权限,角色同时又关联用户的授权的方式

简单地说:一个用户可以拥有若干角色,每一个角色又可以被分配若干权限,这样就构造成“用户-角色-权限” 的授权模型。在这种模型中,用户与角色、角色与权限之间构成了多对多的关系。

 

    

 

在 RBAC 权限模型中,权限与角色相关联,用户通过成为包含特定角色的成员而得到这些角色的权限,这就极大地简化了权限的管理。

为了实现 RBAC 权限模型,数据库表的常见设计如下(一共 5 张表2 张用户建立表之间的联系):

 

        通过这个权限模型,我们可以创建不同的角色并为不同的角色分配不同的权限范围(菜单)。 

         

通常来说,如果系统对于权限控制要求比较严格的话,一般都会选择使用 RBAC 模型来做权限控制。

 

CookieSession 都是用来跟踪浏览器用户身份的会话方式,但是两者的应用场景不太一样。

维基百科是这样定义 Cookie 的:

Cookies 是某些网站为了辨别用户身份而储存在用户本地终端上的数据(通常经过加密)。

简单来说:Cookie 存放在客户端,一般用来保存用户信息

下面是 Cookie 的一些应用案例:

  1. 我们在 Cookie 中保存已经登录过的用户信息,下次访问网站的时候页面可以自动帮你登录的一些基本信息给填了。除此之外,Cookie 还能保存用户首选项,主题和其他设置信息。
  2. 使用 Cookie 保存 SessionId 或者 Token ,向后端发送请求的时候带上 Cookie,这样后端就能取到 Session 或者 Token 了。这样就能记录用户当前的状态了,因为 HTTP 协议是无状态的。
  3. Cookie 还可以用来记录和分析用户行为。举个简单的例子你在网上购物的时候,因为 HTTP 协议是没有状态的,如果服务器想要获取你在某个页面的停留状态或者看了哪些商品,一种常用的实现方式就是将这些信息存放在 Cookie
  4. ……

我这里以 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

要在 Spring Boot 中设置 cookie,我们可以使用类中的方法。您需要做的就是创建一个新实例并将其添加到响应中,如下所示:addCookie()HttpServletResponseCookie

@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。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 称为永久 Cookieusername

注意:传递给 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标志是一个安全特性,由服务器通过设置在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 发送到服务器的 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

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.IllegalStateExceptionusername

读取所有 Cookie

除了使用注解,我们还可以将类用作控制器方法参数来读取所有 cookie。此类提供了将浏览器发送的所有 Cookie 作为 .@CookieValueHttpServletRequestgetCookies()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,您需要创建具有相同名称和指令 to 的类的新实例,然后再次将其添加到响应中,如下所示:CookieMax-Age0

// 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 的简单方法。

  1. @CookieValue annotation 将 cookie 的值映射到 method 参数。您应该设置默认值,以避免在 Cookie 不可用时出现运行时异常。
  2. HttpServletResponse类可用于在浏览器中设置新的 Cookie。您只需创建一个实例并将其添加到响应中。Cookie
  3. 要读取所有 cookie,您可以使用 '方法,该方法返回一个数组 .HttpServletRequestgetCookies()Cookie
  4. Max-Agedirective 指定 cookie 过期的日期和时间。
  5. 如果要在 Cookie 中存储敏感信息,请确保设置 and 属性以避免 XSS 攻击。SecureHttpOnly
  6. 设置 使 Cookie 在当前域的所有位置均可访问。Path=/
  7. 要删除 Cookie,请将 设置为 to 并传递您首次设置它时使用的所有属性。Max-Age0
http://www.lryc.cn/news/479630.html

相关文章:

  • 美国地址生成器站点
  • 微信4.0大版本升级跨平台支持界面全面改版
  • 不想贴秋膘?正确打开秋冬运动姿势
  • 【AIGC半月报】AIGC大模型启元:2024.11(上)
  • 纯前端生成PDF(jsPDF)并下载保存或上传到OSS
  • 海外媒体发稿:旅游业媒体推广12个方面的注意事项-华媒舍
  • 分割回文串(DFS)
  • Qt第三课 ----------容器类控件
  • 打印菱形(C语言)
  • Oracle 19c 中启用 scott 用户
  • git commit 校验
  • 【AtCoder】Beginner Contest 377-B.Avoid Rook Attack
  • 江协科技STM32学习- P38 软件SPI读写W25Q64
  • 【Triton 教程】低内存 Dropout
  • npx创建项目时,error fetch failed.TypeError: fetch failed
  • 《Kotlin实战》-附录
  • yelp数据集上识别潜在的热门商家
  • 【Linux】进程信号全攻略(一)
  • linux文件重命名
  • 如何选择适合的AWS EC2实例类型
  • 【Uniapp】Uniapp Android原生插件开发指北
  • 【随手笔记】FLASH-W25Q16(三)
  • 2024软件测试面试热点问题
  • 【JAVA】java 企业微信信息推送
  • 介绍一下数组(c基础)(smart 版)
  • Java项目实战II基于Spring Boot的个人云盘管理系统设计与实现(开发文档+数据库+源码)
  • 探索数据科学与大数据技术专业本科生的广阔就业前景
  • 微服务架构面试内容整理-Zuul
  • 解决Knife4j 接口界面UI中文乱码问题
  • 微服务架构面试内容整理-Sleuth