ToB企服应用市场:ToB评测及商务社交产业平台

标题: springsecurity 使用浅谈(一) [打印本页]

作者: 大号在练葵花宝典    时间: 2024-3-22 09:42
标题: springsecurity 使用浅谈(一)
1. 背景

  springsecurity框架主要用于Web应用的认证和授权。所谓认证就是验证当前访问系统的是不是本系统的用户,并且要确认具体是哪个用户。而授权就是经过认证后判断当前用户是否有权
限进行某个操作。认证和授权也是SpringSecurity作为安全框架的核心功能。
2. 前置知识

在传统的项目中,我们通常使用会话技术来保存用户信息并进行用户认证。会话是客户端和服务器之间连续的请求和响应过程,用于保持用户的状态信息。然而,HTTP协议本身是无状态的,服务器无法直接识别每个请求的来源,因此需要一种机制来标识和关联请求。
在会话管理中,有两种常见的实现方式:session(会话)和cookie(Cookie)。Session通过在服务器端记录信息来确定用户身份和状态,但这会增加服务器的存储压力。当客户端浏览器访问服务器时,服务器会在服务器端创建一个会话,并为该会话分配一个唯一的标识符,即sessionID。服务器将sessionID发送给客户端浏览器,通常通过设置一个名为"sessionID"的Cookie,将其存储在浏览器中。
一旦客户端浏览器保存了该Cookie,它会在后续的请求中自动发送给服务器,从而实现会话的持续。服务器通过sessionID可以在服务器端找到对应的会话数据,并根据其中的用户状态进行处理。如果浏览器禁用了Cookie,也可以通过URL重写的方式将sessionID作为查询参数发送给服务器。
另一方面,Cookie是服务器在HTTP响应中附带的一个小型文本文件,它存储在客户端浏览器中。一旦浏览器保存了某个Cookie,它会在后续的请求中自动将该Cookie发送给服务器。通过在Cookie中存储一些用户标识或其他数据,服务器可以在不使用session的情况下实现状态保持和用户认证。
最近,使用基于令牌(token)的身份验证方式逐渐流行起来,逐渐取代了传统的session和cookie方式。令牌是一种加密的字符串,它包含了与用户相关的信息,并可以通过在每个请求的头部或参数中携带令牌来实现身份验证。与session和cookie不同,令牌不需要在服务器端存储用户状态,这降低了服务器的存储压力,并且可以更好地支持分布式系统和跨域访问。
总结一下,传统的会话管理中使用了session和cookie来实现用户认证和状态保持。Session通过在服务器端记录信息,而cookie则是在客户端浏览器中存储会话标识符。然而,随着基于令牌的身份验证方式的兴起,令牌逐渐取代了session和cookie,提供了更灵活和可扩展的身份验证机制。令牌通过在请求中携带加密的字符串来验证用户身份,不需要在服务器端存储状态信息,从而提供了更好的性能和安全性。
Session的弊端包括以下几点:
相比之下,Token是一种令牌,由服务端生成的加密字符串,作为客户端请求的标识。当用户登录后,服务器生成一个Token并返回给客户端浏览器,以后客户端只需携带这个Token进行请求即可,无需再次携带用户名和密码。
浏览器将接收到的Token存储在本地存储(Local Storage)中。当浏览器再次访问服务器时,服务器对浏览器传来的Token进行解密,并进行用户数据查询。如果查询成功,则认证通过,实现状态保持。因此,即使有多台服务器,服务器只需解密Token和查询用户数据,而无需在服务器端保存用户的认证信息或会话信息。这就为应用的扩展提供了便利,同时也减少了服务器的存储压力。Token的出现解决了Session的弊端,成为Session的替代品。
JWT

  JWT其实就是一种被广泛使用的token,它的全称是JSON Web Token,它通过数字签名的方式,以JSON对象为载体,在不同的服务终端之间安全地传输信息。
  JWT最常见的使用场景就是授权认证,一旦用户登录,后续每个请求都将包含JWT,系统在每次处理用户请求之前,都要先进行JWT安全校验,通过之后再进行处理。
JWT由三部分组成,它们通过点号(.)进行分隔:
JWT的工作流程如下:
JWT具有以下优点:
3. springsecurity原理

Spring Security的核心原理是基于过滤器链(Filter Chain)的工作机制。当一个请求进入应用程序时,Spring Security会通过一系列的过滤器来处理该请求,进行认证和授权操作。
下面是Spring Security的一般工作流程:

 
3. springsecurity 认证流程


 
在Spring Security中,认证流程涉及多个组件和步骤,主要包括以下几个关键步骤:
4. springsecurity 自定义实现思路

当访问某个业务接口时,会被Security的login接口拦截,但是如果我们不想使用Security默认的登录页面,那么怎么办呢,还有,springsecurity的校验,默认是从内存中查找,而我们希望是根据数据库来做校验,那么怎么实现呢。根据上边的认证流程图可知,我们需要从不满足我们需求的地方去重新实现其方法,按照我们需求实现:
【登录】
①、自定义登录接口。然后自己去调用ProviderManager的方法进行认证 如果认证通过生成jwt,然后把用户信息存入redis中,从而实现无状态的会话管理和快速的用户信息访问。
②、自定义UserDetailsService接口的实现类。在这个实现类中自己重写相应方法,方法去查询数据库,来做校验
【校验】
①、定义Jwt认证过滤器。用于获取token,然后解析token获取其中的userid,还需要从redis中获取用户信息,然后存入SecurityContextHolder。SecurityContextHolder是Spring Security提供的一个类,用于管理当前用户的安全上下文信息。它主要用于在整个请求处理过程中存储和获取当前认证的用户信息

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4