概念
Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案。一般来说,Web 应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分。用户认证指的是验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统。用户认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认证过程。用户授权指的是验证某个用户是否有权限执行某个操作
JWT是json web token缩写。它将用户信息加密到token里,服务器不保存任何用户信息。服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证。也就是我们常说的令牌机制。
优点是在分布式系统中,很好地解决了单点登录问题,很容易解决了session共享的问题。
缺点是无法作废已颁布的令牌/不易应对数据过期。
JWT 的三个部分依次如下。
Header(头部)
Payload(负载)
Signature(签名)
Header
Header 部分是一个 JSON 对象,描述 JWT 的元数据,通常是下面的样子。
{
“alg”: “HS256”,
“typ”: “JWT”
}
上面代码中,alg属性表示签名的算法(algorithm),默认是 HMAC SHA256(写成 HS256);typ属性表示这个令牌(token)的类型(type),JWT 令牌统一写为JWT。
Payload
Payload 部分也是一个 JSON 对象,用来存放实际需要传递的数据。JWT 规定了7个官方字段,供选用。
iss (issuer):签发人
exp (expiration time):过期时间
sub (subject):主题
aud (audience):受众
nbf (Not Before):生效时间
iat (Issued At):签发时间
jti (JWT ID):编号
除了官方字段,你还可以在这个部分定义私有字段,下面就是一个例子。
{
“sub”: “1234567890”,
“name”: “John Doe”,
“admin”: true
}
注意,JWT 默认是不加密的,任何人都可以读到,所以不要把秘密信息放在这个部分。
这个 JSON 对象也要使用 Base64URL 算法转成字符串。
3.3 Signature
Signature 部分是对前两部分的签名,防止数据篡改。
首先,需要指定一个密钥(secret)。这个密钥只有服务器才知道,不能泄露给用户。然后,使用 Header 里面指定的签名算法(默认是 HMAC SHA256),按照下面的公式产生签名。
HMACSHA256(
base64UrlEncode(header) + “.” +
base64UrlEncode(payload),
secret)
算出签名以后,把 Header、Payload、Signature 三个部分拼成一个字符串,每个部分之间用"点"(.)分隔,就可以返回给用户。
最后,将上面的 JSON 对象使用 Base64URL 算法(详见后文)转成字符串
准备工作
1),开启数据库服务,因为我们的demo需要查询数据库,并创建好rbac数据库表,并录入测试数据。
2).搭建一个spring boot工程,并导入 spring security JWT 所需要jar包
3)maven仓库下载完成以后,我们写入我们所需要的配置信息
这里我们也可以配置连接池。
4)到此,一个基本的项目环境搭建起来了,我们可以先运行一下,启动过程中是否出错
正式开始
1).spring security是基于过滤器 拦截请求,实现资源的保护的思想,至于框架底层源码小编也在学习当中,我们可以去官网上面看详细介绍,同时现在网上有很多资料作为参考,首先 我们写好我们的配置
2)登陆模拟之前
a.创建实体类,我们可以通过内置mybatis-generator的maven插件生成,后续在做
b),我们需要写好先数据访问层的代码,查询用户信息,便于框架基于我们的配置自动调用
c),我们可以新建一个service包,注入UserMapper属性。
d),上面说到,spring security是基于过滤器实现请求拦截,而且我们在上面配置当中 也配置了过滤器,因此我们着手写一个过滤器,在过滤方法当中 生成 验证 我们的 token
此方法为主要方法
小编为了方便 把jwt的各项参数 写进了 属性文件(.properties)以便在spring容器启动时可以加载到该文件,并且我们在程序当中引用
d),接下来,我们需要写我们的jwt工具类 提供 生成,验证,判断token是否有效,刷新等 token的方法
e),由于在配置中我们写好了认证成功,认证失败,无权限访问的回调,因此,我们也需要新建这三个类文件,来规定我们的的方法回调
f),由于我们前台用户登录或访问其他路径时,都需携带token进行认证,这里我们 需要单独提供给一个生成token的接口,根据我们的用户名生成,在配置里面 定义好密码的加密算法。
g),我们加入我们的 登陆页面,主页面以及错误页面
f.启动项目 测试,首先我们生成token的接口 ,先生成token
g)token生成成功,接下来 我们访问登录接口,并在请求头中带上我们的token信息
由于我们配置了登陆成功页面所以当我们认证成功以后 会进入主页面
h)接下来,我们再次访问登录接口 并提供错误的密码
接下来我们访问登陆页面(注意这里请求方式要为get),我们只需在提交表单时 往请求头里放入获取过来的token(客户端可以保存在缓存当中)就可实现认证授权
springsecurity 相关知识
https://blog.csdn.net/zhoucheng05_13/article/details/60467234
作者:安静的小海豹
来源:CSDN
原文:https://blog.csdn.net/qq_38412637/article/details/85644876
版权声明:本文为博主原创文章,转载请附上博文链接!