修改Spring Security
登录验证模式
传统的验证登录模式
- 公开页面:输入url就可以直接访问
- 授权页面:登录之后才可以访问
Jwt验证模式
- 容易实现跨域
- 不需要在服务器端存储
对比于传统模式将所有的sessionId
换成jwt token
access token
refresh token
过程:通过一个login页面获取一个token,将其存入浏览器中,当访问授权页面的时候都会带上这个token,先验证这个token(包含userId)是否合法,根据userId到数据库中查询信息,提取到上下文中,访问授权的方法。
以上是原理,如何操作呢
- 添加
jwt
依赖,官网搜索jwt
包括jjwt-api
jjwt-impl
jjwt-jackson
- 实现
utils.JwtUtil
类,为jwt
工具,用来创建、解析Jwt token
, 如果JwtUtil
爆红,可以降低到0.11.5
版本试一下。 - 实现
config.filter.JwtAuthenticationTokenFilter
类,用来验证jwt token
,如果验证成功,则将User信息注入上下文中 - 配置
config.SecurityConfig
类,放行登录、注册等接口
编写API
一般步骤:service
里面接口及其实现类,然后编写controller
里面的类,
- 将数据库中的id域变为自增
- 在数据库中将id列变为自增
- 在
pojo.User
类中添加注解:@TableId(type = IdType.AUTO)
- 实现
/user/account/token/
:验证用户名密码,验证成功后返回jwt token
(令牌) - 实现
/user/account/info/
:根据令牌返回用户信息 - 实现
/user/account/register/
:注册账号
过程是这样的:首先写接口,然后写接口的实现类(实现类之前的接口),然后编写Controller
需要测试,可以学习一下postman
或者直接使用前端进行测试
这里使用之前写好的前端进行测试
知识点的补充学习
HTTP协议中的GET和POST是两种常用的请求方法,它们在Web开发中有着不同的用途和特点:
Post请求和Get请求
-
GET请求:
- 用途:用于请求从服务器获取数据。通常用于查询字符串参数,如搜索或过滤数据。
- 数据传输:数据通过URL传递,附加在请求的URL之后。
- 安全性:由于数据在URL中可见,因此不安全,不应用于传输敏感信息。
- 缓存:GET请求可以被缓存,这意味着相同的请求可以快速响应,提高效率。
- 书签:可以被保存为书签。
- 历史:可以在浏览器历史中保留。
- 长度限制:URL长度有限制,因此GET请求传输的数据量有限。
-
POST请求:
- 用途:用于向服务器提交数据,通常用于表单提交或上传文件。
- 数据传输:数据在请求体(body)中传输,不在URL中。
- 安全性:比GET更安全,因为数据不在URL中显示。
- 缓存:POST请求不会被缓存。
- 书签:不能被保存为书签。
- 历史:不会在浏览器历史中保留。
- 长度限制:没有长度限制,可以传输大量数据。
在选择使用GET还是POST时,通常考虑以下因素:
- 如果需要获取数据,并且数据量不大,可以使用GET。
- 如果需要向服务器提交数据,或者数据量较大,应该使用POST。
- 对于敏感数据,应避免使用GET,因为它可能会在URL中暴露数据。
在实际开发中,还应考虑其他HTTP方法,如PUT(更新资源)、DELETE(删除资源)、PATCH(部分更新资源)等,根据具体需求选择合适的方法。
jwt的介绍
JSON Web Token(JWT)是一种用于在网络应用环境间传递声明的紧凑、URL安全的开放标准(RFC 7519)。它被设计为紧凑且安全的,适用于分布式站点的单点登录(SSO)场景。JWT的声明通常用于在身份提供者和服务提供者间传递被认证的用户身份信息,以便从资源服务器获取资源,也可以增加一些额外的业务逻辑所需的声明信息。JWT可以被用于认证,也可以被加密。
JWT由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。头部包含两部分信息:令牌的类型(通常是JWT)和使用的加密算法(如HMAC SHA256或RSA)。载荷部分存放有效信息,包括注册的声明(如iss、exp、sub、aud等)、公共的声明和私有的声明。签名部分用于验证发送请求者身份,由前两部分加密形成。JWT的优点包括体积小、传输速度快,可以通过URL、POST参数或HTTP头部等方式传输,支持跨域验证,适用于单点登录,且由于其自包含性,可以有效减少服务器查询数据库的次数。然而,JWT也有其局限性,如不能存储敏感信息,因为其载荷是使用Base64编码的,没有加密,且JWT一旦签发,不能被撤销,只能等到过期。在实际应用中,JWT可以用于身份验证、信息交换、单点登录和微服务架构等场景。为了保证安全性,建议不要在JWT中存放敏感信息,设置合理的有效期,确保传输过程安全,并考虑在应用程序层面增加额外的安全措施,如黑名单机制等。