学习笔记_认证授权

Authentication(认证) 是验证您的身份的凭据(例如用户 ID 和密码)

Authorization(授权) 发生在 Authentication(认证) 之后。授权主要掌管我们访问系统的权限。

RBAC模型

RBAC 即基于角色的权限访问控制(Role-Based Access Control)。这是一种通过角色关联权限,角色同时又关联用户的授权的方式。在这种模型中,用户与角色、角色与权限之间构成了多对多的关系。

设计:

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

应用:

保存已经登录过的用户信息、保存用户首选项,主题和其他设置信息。

由于 HTTP 协议是无状态的,可以使用 Cookie 保存 SessionId 或者 Token,向后端发送请求的时候带上 Cookie,记录用户当前的状态

可以用来记录和分析用户行为,如果服务器想要获取你在某个页面的停留状态或者看了哪些商品,一种常用的实现方式就是将这些信息存放在 Cookie

1)设置 Cookie 返回给客户端

@GetMapping("/change-username")
public String setCookie(HttpServletResponse response) {
    // 创建一个 cookie
    Cookie 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("/")
public String readCookie(@CookieValue(value = "username", defaultValue = "Atta") String username) {
    return " 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(", "));
    }  //将 cookies 数组转换为一个流

    return "No cookies";
}
 

Session 的主要作用是通过服务端记录用户的状态。相对来说 Session 安全性更高。

应用:购物车,服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户

Session_Cookie身份验证

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

确保客户端开启 Cookie,注意 Session 的过期时间

多节点Session_Cookie身份验证

用户第一次登陆的时候 ,Nginx 通过负载均衡机制将用户请求转发到 A 服务器,此时用户的 Session 信息保存在 A 服务器。结果,用户第二次访问的时候 Nginx 将请求路由到 B 服务器,由于 B 服务器没有保存 用户的 Session 信息,导致用户需要重新进行登陆。

  1. 某个用户的所有请求都通过特性的哈希策略分配给同一个服务器处理。这样的话,每个服务器都保存了一部分用户的 Session 信息。服务器宕机,其保存的所有 Session 信息就完全丢失了。
  2. 每一个服务器保存的 Session 信息都是互相同步的,也就是说每一个服务器都保存了全量的 Session 信息。每当一个服务器的 Session 信息发生变化,我们就将其同步到其他服务器。这种方案成本太大,并且,节点越多时,同步成本也越高。
  3. 单独使用一个所有服务器都能访问到的数据节点(比如缓存)来存放 Session 信息。为了保证高可用,数据节点尽量要避免是单点。
  4. Spring Session 是一个用于在多个服务器之间管理会话的项目。它可以与多种后端存储(如 Redis、MongoDB 等)集成,从而实现分布式会话管理。通过 Spring Session,可以将会话数据存储在共享的外部存储中,以实现跨服务器的会话同步和共享。

没有Cookie,可以将 SessionID 放在请求的 url 里面,但是安全性和用户体验感降低。当然,为了安全你也可以对 SessionID 进行一次加密之后再传入后端。

token防止CSRF攻击

跨站请求伪造,如果别人通过 Cookie 拿到了 SessionId 后就可以代替你的身份访问系统。

但是,我们使用 Token 的话就不会存在这个问题,在我们登录成功获得 Token 之后,一般会选择存放在 localStorage (浏览器本地存储)中。然后我们在前端通过某些方式会给每个发到后端的请求加上这个 Token,这样就不会出现 CSRF 漏洞的问题。因为,即使你点击了非法链接发送了请求到服务端,这个非法请求是不会携带 Token 的,所以这个请求将是非法的。

不论是 Cookie 还是 Token 都无法避免 跨站脚本攻击(Cross Site Scripting)XSS 。XSS 中攻击者会用各种方式将恶意代码注入到其他用户的页面中。

20240722    来源:JavaGuide

  • 13
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值