一、什么是Jwt?
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准
((RFC 7519).该 token 被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。
JWT 的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服
务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该 token 也可直接被用于
认证,也可被加密。
官网:https://jwt.io/introduction/
简单的说:jwt就是一个json字符串 它可以存储任何信息。
内置了校验-我们只需要请求时给到它生产出来的token令牌即可解析到我们存储进去的信息。
1.创建jwtDemo Maven工程
<!-- 添加 jwt 的依赖 --> <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.11.0</version> </dependency>
2.创建jwtTest.class
import com.auth0.jwt.JWT; import com.auth0.jwt.JWTVerifier; import com.auth0.jwt.algorithms.Algorithm; import com.auth0.jwt.exceptions.JWTVerificationException; import com.auth0.jwt.interfaces.Claim; import com.auth0.jwt.interfaces.DecodedJWT; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.Map; /** * ClassName: JwtTest * 个人博客: https://yby6.com * @author yangbuyiya * @Date: 2021-03-25 10:05 * @Description: $ **/ public class JwtTest { /** * 加密jwt * * @param username * @return */ public static String createJwt(String username) { // 颁发时间 Date createTime = new Date(); // 过期时间 Calendar now = Calendar.getInstance(); // 设置未来时间 秒 now.set(Calendar.SECOND, 7200); Date expireTime = now.getTime(); // header Map<String, Object> header = new HashMap<>(4); header.put("alg", "HS256"); header.put("type", "JWT"); // 载体 return JWT.create() // 设置头部信息 .withHeader(header) // 设置创建时间 .withIssuedAt(createTime) // 设置过期时间 .withExpiresAt(expireTime) // 设置主体 .withSubject("这是一个JWT") // 设置载荷--也就是用户信息 .withClaim("username", username) .withClaim("pwd", "123456") // 设置签名密钥 .sign(Algorithm.HMAC256("yby-jwt")); } /** * 解密jwt * * @param jwt * @return */ public static boolean decryptJwt(String jwt) { // 带入密钥解密 JWTVerifier require = JWT.require(Algorithm.HMAC256("yby-jwt")).build(); try { DecodedJWT verify = require.verify(jwt); // 根据设置的key获取对应的value Claim username = verify.getClaim("username"); System.out.println(username.asString()); System.out.println(verify.getSignature()); System.out.println(verify.getSubject()); return true; } catch (JWTVerificationException e) { e.printStackTrace(); return false; } } public static void main(String[] args) { // 创建令牌 System.out.println(createJwt("杨不易")); // 解析令牌 System.out.println(decryptJwt("eyJ0eXAiOiJKV1QiLCJ0eXBlIjoiSldUIiwiYWxnIjoiSFMyNTYifQ.eyJzdWIiOiLov5nmmK_kuIDkuKpKV1QiLCJleHAiOjE2MTcwODAyMjAsInB3ZCI6IjEyMzQ1NiIsImlhdCI6MTYxNzA3MzAzMSwidXNlcm5hbWUiOiLmnajkuI3mmJMifQ.GJOeFSVsAwFPcgUlalmxVXt0QQ-Be5bhGUtL1ep04vM")); } }
3.测试jwt
创建令牌
解析令牌信息
4.JWT的总结
JWT就是一个加密的带用户信息的字符串,没学习JWT之前,我们在项目中都是返回一个基本的
字符串,然后请求时带上这个字符串,再从session或者redis中(共享session)获取当前用户,
学过JWT以后我们可以把用户信息直接放在字符串返回给前段,然后用户请求时带过来,我们是在
服务器进行解析拿到当前用户,这就是两种登录方式,这两种方式有各自的优缺点,我们在后面
Oauth2.0+jwt中详细学习
二、什么是SpringSecurity?
Spring Security 是一个能够为基于 Spring 的企业应用系统提供声明式的安全访问控制解决方案 的安全框架。它提供了一组可以在 Spring 应用上下文中配置的 Bean,充分利用了 Spring IoC, DI(控制反转 Inversion of Control ,DI:Dependency Injection 依赖注入)和 AOP(面向切 面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量 重复代码的工作。 以上解释来源于百度百科。可以一句话来概括,SpringSecurity 是一个安全框架。
1.Spring Security 入门体验
创建项目 springsecurity-hello
创建Controller请求访问
启动测试访问
http://127.0.0.1:8080/hello
发现我们无法访问 hello 这个请求,这是因为 spring Security 默认拦截了所有请求
我们在启动日志当中复制密码
用户名默认是 user 哦
登录成功之后访问 controller
测试退出
页面当中输入: http://127.0.0.1:8080/logout
自定义密码登录(yml 配置文件方式)
spring: security: user: name: admin #默认使用的用户名 password: 123456 #默认使用的密码
重启使用 admin 和 123456 登录即可
总结
从上面的体验来说,是不是感觉很简单,但是别急。后面的东西还是有点难度的,
如下:
如何读取数据库的用户名和密码
如何对密码加密
如何使用数据的角色和权限
如何配置方法级别的权限访问
如何自定义登陆页面
如何集成 redis 把登陆信息放到 Redis
…