001 Security概述
1.Spring Security概述
Spring Security是用于解决认证与授权的框架
- SpringSecurity默认要求所有的请求都是必须先登录才允许的访问
BCrypt加密算法
BCrypt优秀的加密算法工具,不可逆算法,类似于MD5
-
传输过程加密: 加密->解密
-
存储结果加密
2.Session机制和Token机制
Session: SessionID (UUID)验证机制,不可共享,
Token: 票据验证机制 JWT
### 2.1 JWT(**J**son **W**eb **T**oken)
2.1.1 JWT组成
JWT的组成部分:Header(头),Payload(载荷),Signature(签名)
// Header:指定算法与当前数据类型
// 格式为: { "alg": 算法, "typ": "jwt" }
.setHeaderParam(Header.CONTENT_TYPE, "HS256")
.setHeaderParam(Header.TYPE, Header.JWT_TYPE)
// Payload:通常包含Claims(自定义数据)和过期时间
.setClaims(claims)
.setExpiration(new Date(System.currentTimeMillis() + 5 * 60 * 1000))
// Signature:由算法和密钥(secret key)这2部分组成
.signWith(SignatureAlgorithm.HS256, secretKey)
// 打包生成
.compact();
2.1.2 JWT解析
String jwt = "eyJjdHkiOiJIUzI1NiIsInR5cCI6IkpXVCIsImFsZyI6IkhTMjU2In0.eyJuYW1lIjoi5pyI5LquIiwiaWQiOjk1MjcsImV4cCI6MTY1NTcxMTYwN30.6r491chs36tklI3LZnABAsOLoAOr-wIosKrElOS8-kg";
Claims claims = Jwts.parser()
.setSigningKey(secretKey).parseClaimsJws(jwt).getBody();
Object id = claims.get("id");
Object name = claims.get("name");
System.out.println("id = " + id);
System.out.println("name = " + name);
2.2 重点: Spring Security的大致实现流程
当通过以上URL进行访问时,其内部过程大概是:
- Spring Security的相关配置会进行URL的检查,来判断是否允许访问此路径
- 所以,需要在SecurityConfiguration中将以上路径设置为白名单
- 如果没有将以上路径配置到白名单,将直接跳转到登录页,因为默认所有请求都必须先登录
- 由AdminController接收到请求后,调用了IAdminService接口的实现类对象来处理登录
- IAdminService接口的实现是AdminServiceImpl
- 在AdminServiceImpl中,调用了AuthenticationManager处理登录的认证
- AuthenticationManager对象调用authenticate()方法进行登录处理
- 内部实现中,会自动调用UserDetailsService实现对象的loadUserByUsername()方法以获取用户信息,并自动完成后续的认证处理(例如验证密码是否正确),所以,在步骤中,具体执行的是UserDetailsServiceImpl类中重写的方法,此方法返回了用户信息,Spring Security自动验证,如果失败(例如账号已禁用、密码错误等),会抛出异常
- 以上调用的authenticate()方法如果未抛出异常,可视为认证成功,即登录成功
- 当登录成功时,应该返回此用户的JWT数据(暂时未实现)
- AuthenticationManager对象调用authenticate()方法进行登录处理
拓展:
resultMap与resultType
resultMap是指导Mybatis对查询结果的封装
resultType: 在添加驼峰配置的前提下可以适用用单表查询方便