文章目录
学习视频:SpringSecurity
一、知识补充
1.单点登录:
单点登录:微服务中有众多模块,你在某一个模块完成登录验证后就不需要在其它模块进行登录验证了
2.认证授权过程分析
(1)基于 Session,如果基于 Session,那么 Spring-security 会对 cookie 里的 sessionid 进行解析,找到服务器存储的 session 信息,然后判断当前用户是否符合请求的要求。但是session做单点登录并不是很方便。
(2)基于 token,(token就是按一定规则生成的包含用户信息的字符串),基于 Session则是解析出 token,然后将当前请求加入到 Spring-security 管理的权限信息中去。这是SpringSecurity微服务中最常用的方式。
3.使用token的流程
如果系统的模块众多,每个模块都需要进行授权与认证,所以我们选择基于token 的形式进行授权与认证,用户根据用户名密码认证成功,然后获取当前用户角色的一系列权限 值,并以用户名为 key,权限列表为 value 的形式存入 redis 缓存中,根据用户名相关信息 生成 token返回,浏览器将 token记录到 cookie 中,每次调用 api 接口都默认将 token携带 到 header 请求头中,Spring-security 解析 header 头获取 token 信息,解析 token 获取当前 用户名,根据用户名就可以从 redis 中获取权限列表,这样 Spring-security 就能够判断当前 请求是否有权限访问
二、微服务案例
项目工程
启动redis和nacos
1.启动redis
2.启动nacos
spring_security代码
1、工具类
1.DeafultPasswordEncoder密码处理工具类
@Component
public class DefaultPasswordEncoder implements PasswordEncoder {
//有参构造和无参构造
public DefaultPasswordEncoder() {
this(-1);}
public DefaultPasswordEncoder(int strength) {
}
//进行MD5加密
@Override
public String encode(CharSequence charSequence) {
return MD5.encrypt(charSequence.toString());
}
//进行密码比对
@Override
public boolean matches(CharSequence charSequence, String encodedPassword) {
return encodedPassword.equals(MD5.encrypt(charSequence.toString()));
}
}
2.TokenManager(token操做工具类)
①使用jwt根据用户名生成token ②根据token字符串得到用户信息 ③删除token
@Component
public class TokenManager {
//token有效时长
private long tokenEcpiration = 24*60*60*1000;
//编码秘钥
private String tokenSignKey = "123456";
//1 使用jwt根据用户名生成token
public String createToken(String username) {
String token = Jwts.builder().setSubject(username)//根据用户名生成token
.setExpiration(new Date(System.currentTimeMillis()+tokenEcpiration))//设置过期时间(过期时间=当前时间+有效时长)
.signWith(SignatureAlgorithm.HS512, tokenSignKey).compressWith(CompressionCodecs.GZIP).compact();//这一行写法固定
return token;
}
//2 根据token字符串得到用户信息
public String getUserInfoFromToken(String token) {
String userinfo = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token).getBody().getSubject();
return userinfo;
}
//3 删除token
public void removeToken(String token) {
}
}
2、SpringSecurity相关的逻辑
1.spring_security的核心配置类TokenWebsecurityConfig
在这个类里面配置了哪些路径要认证,密码处理的工具是啥,退出登录时的处理器,自定义过滤器等等
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class TokenWebSecurityConfig extends WebSecurityConfigurerAdapter {
private TokenManager tokenManager;
private RedisTemplate redisTemplate;
private DefaultPasswordEncoder defaultPasswordEncoder;
private UserDetailsService userDetailsService;
@Autowired
public TokenWebSecurityConfig(UserDetailsService userDetailsService, DefaultPasswordEncoder