Day47_Spring Security—Spring Security的微服务使用

学习视频: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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BlackTurn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值