RBAC 模型

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

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

什么是 Cookie ? Cookie 的作用是什么?

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

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

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

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

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

Cookie 和 Session 有什么区别?

Session 的主要作用就是通过服务端记录用户的状态。 典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了。

Cookie 数据保存在客户端(浏览器端),Session 数据保存在服务器端。相对来说 Session 安全性更高。如果使用 Cookie 的一些敏感信息不要写入 Cookie 中,最好能将 Cookie 信息加密然后使用到的时候再去服务器端解密。

如何使用 Session-Cookie 方案进行身份验证?

很多时候我们都是通过 SessionID 来实现特定的用户,SessionID 一般会选择存放在 Redis 中。举个例子:

  1. 用户成功登陆系统,然后返回给客户端具有 SessionIDCookie
  2. 当用户向后端发起请求的时候会把 SessionID 带上,这样后端就知道你的身份状态了。

关于这种认证方式更详细的过程如下:

  1. 用户向服务器发送用户名、密码、验证码用于登陆系统。
  2. 服务器验证通过后,服务器为用户创建一个 Session,并将 Session 信息存储起来。
  3. 服务器向用户返回一个 SessionID,写入用户的 Cookie
  4. 当用户保持登录状态时,Cookie 将与每个后续请求一起被发送出去。
  5. 服务器可以将存储在 Cookie 上的 SessionID 与存储在内存中或者数据库中的 Session 信息进行比较,以验证用户的身份,返回给用户客户端响应信息的时候会附带用户当前的状态。

使用 Session 的时候需要注意下面几个点:

  1. 依赖 Session 的关键业务一定要确保客户端开启了 Cookie
  2. 注意 Session 的过期时间。

多服务器节点下 Session-Cookie 方案如何做?

Session-Cookie 方案在单体环境是一个非常好的身份认证方案。但是,当服务器水平拓展成多节点时,Session-Cookie 方案就要面临挑战了。

举个例子:假如我们部署了两份相同的服务 A,B,用户第一次登陆的时候 ,Nginx 通过负载均衡机制将用户请求转发到 A 服务器,此时用户的 Session 信息保存在 A 服务器。结果,用户第二次访问的时候 Nginx 将请求路由到 B 服务器,由于 B 服务器没有保存 用户的 Session 信息,导致用户需要重新进行登陆。

我们应该如何避免上面这种情况的出现呢?

有几个方案可供大家参考:

  1. 某个用户的所有请求都通过特性的哈希策略分配给同一个服务器处理。这样的话,每个服务器都保存了一部分用户的 Session 信息。服务器宕机,其保存的所有 Session 信息就完全丢失了。
  2. 每一个服务器保存的 Session 信息都是互相同步的,也就是说每一个服务器都保存了全量的 Session 信息。每当一个服务器的 Session 信息发生变化,我们就将其同步到其他服务器。这种方案成本太大,并且,节点越多时,同步成本也越高。
  3. 单独使用一个所有服务器都能访问到的数据节点(比如缓存)来存放 Session 信息。为了保证高可用,数据节点尽量要避免是单点。

如果没有 Cookie 的话 Session 还能用吗?

这是一道经典的面试题!

一般是通过 Cookie 来保存 SessionID ,假如你使用了 Cookie 保存 SessionID 的方案的话, 如果客户端禁用了 Cookie,那么 Session 就无法正常工作。

但是,并不是没有 Cookie 之后就不能用 Session 了,比如你可以将 SessionID 放在请求的 url 里面https://javaguide.cn/?Session_id=xxx 。这种方案的话可行,但是安全性和用户体验感降低。当然,为了你也可以对 SessionID 进行一次加密之后再传入后端。

什么是 Token?什么是 JWT?

有没有一种不需要自己存放 Session 信息就能实现身份验证的方式呢?使用 Token 即可!JWT (JSON Web Token) 就是这种方式的实现,通过这种方式服务器端就不需要保存 Session 数据了,只用在客户端保存服务端返回给客户的 Token 就可以了,扩展性得到提升。

JWT 本质上就一段签名的 JSON 格式的数据。由于它是带有签名的,因此接收者便可以验证它的真实性。

JWT 由 3 部分构成:

  1. Header : 描述 JWT 的元数据,定义了生成签名的算法以及 Token 的类型。
  2. Payload : 用来存放实际需要传递的数据
  3. Signature(签名) :服务器通过PayloadHeader和一个密钥(secret)使用 Header 里面指定的签名算法(默认是 HMAC SHA256)生成。

如何基于 Token 进行身份验证?

在基于 Token 进行身份验证的的应用程序中,服务器通过PayloadHeader和一个密钥(secret)创建令牌(Token)并将 Token 发送给客户端,客户端将 Token 保存在 Cookie 或者 localStorage 里面,以后客户端发出的所有请求都会携带这个令牌。你可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP Header 的 Authorization 字段中:Authorization: Bearer Token

  1. 用户向服务器发送用户名和密码用于登陆系统。
  2. 身份验证服务响应并返回了签名的 JWT,上面包含了用户是谁的内容。
  3. 用户以后每次向后端发请求都在 Header 中带上 JWT。
  4. 服务端检查 JWT 并从中获取用户相关信息。

什么是 SSO?

SSO(Single Sign On)即单点登录说的是用户登陆多个子系统的其中一个就有权访问与其相关的其他系统。举个例子我们在登陆了京东金融之后,我们同时也成功登陆京东的京东超市、京东国际、京东生鲜等子系统。

什么是 OAuth 2.0?

OAuth 是一个行业的标准授权协议,主要用来授权第三方应用获取有限的权限。而 OAuth 2.0 是对 OAuth 1.0 的完全重新设计,OAuth 2.0 更快,更容易实现,OAuth 1.0 已经被废弃。

实际上它就是一种授权机制,它的最终目的是为第三方应用颁发一个有时效性的令牌 Token,使得第三方应用能够通过该令牌获取相关的资源。

OAuth 2.0 比较常用的场景就是第三方登录,当你的网站接入了第三方登录的时候一般就是使用的 OAuth 2.0 协议。

另外,现在 OAuth 2.0 也常见于支付场景(微信支付、支付宝支付)和开发平台(微信开放平台、阿里开放平台等等)。

认证 (Authentication) 和授权 (Authorization)相关推荐

  1. Flex与.NET互操作(九):FluorineFx.NET的认证(Authentication )与授权(Authorization)

    FluorineFx.NET的认证(Authentication )与授权(Authorization)和ASP.NET中的大同小异,核实用户的身份既为认证,授权则是确定一个用户是否有某种执行权限,应 ...

  2. .net中的认证(authentication)与授权(authorization)

    注:这篇文章主要给新手看的,老手们可能会觉得没啥营养,就请绕过吧. "认证"与"授权"是几乎所有系统中都会涉及的概念,通俗点讲: 认证(authenticati ...

  3. 谈谈系统认证 (Authentication) 和授权 (Authorization)

    这是一个绝大多数人都会混淆的问题. 说简单点就是: 认证 (Authentication): who,你是谁 授权 (Authorization): what,你有权限干什么 稍微正式点的说法就是: ...

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

    说简单点就是: 认证 (Authentication): 你是谁. 授权 (Authorization): 你有哪些权限 干什么事情. 稍微正式点(啰嗦点)的说法就是: Authentication( ...

  5. 认证(Authentication)和授权(Authorization)

    如果是客户端系统,比如winform,wpf构建的系统,你登陆之后,会看到自己权限可以操作的东西.你也很难通过其他方式,调用系统的方法.但是在BS系统中,请求和响应都是通过HTTP协议进行的,而且通过 ...

  6. 认证(Authentication),授权(Authorization) 以及Cookie、Session

    1.认证和授权 1.1 首先二者的读法不同 认证: Authentication 授权: Authorization 1.2  认证和鉴权是什么? 从简单的角度来说: 认证: 理解为你是谁 授权: 理 ...

  7. 认证 (authentication) 和授权 (authorization)小记

    原文地址 以前一直分不清 authentication 和 authorization,其实很简单,举个例子来说: 你要登机,你需要出示你的身份证和机票,身份证是为了证明你张三确实是你张三,这就是 a ...

  8. 认证 (authentication) 和授权 (authorization) 的区别.md

    以前一直分不清 authentication 和 authorization,其实很简单: 举个例子来说: 你要登机,你需要出示你的身份证和机票,身份证是为了证明你张三确实是你张三,这就是 authe ...

  9. 认证 (authentication) 和授权 (authorization) 的区别(通俗易懂!!)

    以前一直分不清 authentication 和 authorization,其实很简单,举个例子来说: 你要登机,你需要出示你的身份证和机票,身份证是为了证明你张三确实是你张三,这就是 authen ...

最新文章

  1. 现学现卖微信小程序开发(二)
  2. 利用js对页面数据进行排序
  3. ASP.NET中实现模版的动态加载
  4. 强势回归!比 Python 快 20% 的 Pyston v2.0 来了!
  5. #012python实验课
  6. java数据段 静态区_linux进程的堆栈空间_代码段(指令,只读)、数据段(静态变量,全局变量)、堆栈段(局部变量)、栈【转】...
  7. CCF201509-2 日期计算(100分)
  8. 中国第一个计算机病毒什么时候,新中国成立以来的第一例电脑病毒小球病毒是在1988年发现...
  9. 自定义控件+ViewPage+Fragment....各种收获
  10. 在线搜索全网音乐支持歌曲外链下载等源码[免费开源]
  11. kindle买书建议
  12. AES256加解密java语言实现
  13. 基于微信功能社群助手
  14. 谱尼医学幽门螺旋杆菌快速检测 三步直达 欢迎选测~
  15. 高等数学 - 球坐标计算三重积分
  16. PHP 接入 Apple 登录对 access_token/identityToken 进行 JWT 验证
  17. 计算机组老师颁奖词,学生表彰颁奖词与学生计算机室管理制度合集.doc
  18. 【word小技巧】用WPS调整你的论文格式
  19. 记一次PDFRenderer使用renderImage方法报错java.lang.IndexOutOfBoundsException解决方法
  20. UDP 实现多收多发,广播发送,组播发送 TCP 实现多收多发

热门文章

  1. Ubuntu-查看ubuntu系统的版本信息
  2. 排列组合之错排问题总结
  3. 【新星计划】Demo---Expanding Cards------ 1/50(详解)
  4. JSP设置Excel表格换行_Excel表格技巧—如何调整工作表打印页面设置
  5. 手把手做一个JSP入门程序(九):购物车的基本实现(Servlet)
  6. 利用JSP与JS实现简易购物车
  7. epoll_create1与epoll_create区别
  8. linux中如果编译二进制,在linux中把汇编或c程序交叉编译成二进制文件烧录开发板过程详解...
  9. CentOS Docker使用ELK监听日志
  10. 单点登录(4):单点登录实现(附源码)