4-单点登录&社交登录&SpringSession

1、SSO(single sign on)模式

优点 : 用户身份信息独立管理,更好的分布式管理。可以自己扩展安全策略

缺点: 认证服务器访问压力较大。

2、Token模式

优点:

无状态: token无状态,session有状态的

基于标准化: 你的API可以采用标准化的 JSON Web Token (JWT)

**缺点:**占用带宽。无法在服务器端销毁

解决方案:JWT令牌

**JWT用法: **

客户端接收服务器按一定规则生成然后返回的JWT,将其存储在Cookie或localStorage中。此后,客户端将在与服务器交互中都会带JWT。如果将它存储在Cookie中,就可以自动发送,但是不会跨域,因此一般是将它放入HTTP请求的Header Authorization字段中。当跨域时,也可以将JWT被放置于POST请求的数据主体中。

**JWT问题和趋势: **

  • JWT不仅可用于认证,还可用于信息交换。善用JWT有助于减少服务器请求数据库的次数。
  • 生产的token可以包含基本信息,比如id、用户昵称、头像等信息,避免再次查库
  • 存储在客户端,不占用服务端的内存资源
  • JWT默认不加密,但可以加密。生成原始令牌后,可以再次对其进行加密。
  • 当JWT未加密时,一些私密数据无法通过JWT传输。
  • JWT的最大缺点是服务器不保存会话状态,所以在使用期间不可能取消令牌或更改令牌的权限。也就是说,一旦JWT签发,在有效期内将会一直有效。
  • JWT本身包含认证信息,token是经过base64编码,所以可以解码,因此token加密前的对象不应该包含敏感信息,一旦信息泄露,任何人都可以获得令牌的所有权限。为了减少盗用,JWT的有效期不宜设置太长。对于某些重要操作,用户在使用时应该每次都进行进行身份验证。
  • 为了减少盗用和窃取,JWT不建议使用HTTP协议来传输代码,而是使用加密的HTTPS协议进行传输。

3、OAuth2.0

解决Session共享问题

使用Springsession完成子域session共享

使用cookie存储jsessionid并设定为.gomall.com域名下,这样所有相关的域名请求都会携带这个cookie,然后经过springsession的过滤器执行链包装成一个获取session的请求,去存储session的数据库中获取。

/**
 * springsession的核心原理:
 * 		1:@EnableRedisHttpSession导入RedisHttpSessionConfiguration配置sessionRepository==》RedisHttpSessionConfiguration给容器中添加了一个组件:RedisIndexedSessionRepository:==》redis操作session,session的增删改查封装类
 * 		2:RedisHttpSessionConfiguration 继承了SpringHttpSessionConfiguration这里面有一个SessionRepositoryFilter组件==》filiter:session存储过滤器:每个请求过来都必须经过filiter
 * 		1:创建的时候,就自动从容器中获取到了sessionRepository
 * 		2:SessionRepositoryFilter类里面调用了doFilterInternal方法==》原始的request,response都被这个方法包装成了SessionRepositoryRequestWrapper  SessionRepositoryResponseWrapper
 * 		3:以后获取session。request.getSession
 * 		4:wrappedRequest.getSession()===>SessionRespository中获取到
 * 装饰者模式
 * 自动延期,redis中的数据也是有过期时间的
 **/
@EnableRedisHttpSession
@Configuration
public class GomallSessionConfig {
    @Bean
    public CookieSerializer cookieSerializer() {
        DefaultCookieSerializer serializer = new DefaultCookieSerializer();
        serializer.setCookieName("GOSESSION");  // 设置cookie名字
        serializer.setDomainName("gomall.com"); // 指定域名
        return serializer;
    }
    @Bean
    public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
        return new GenericJackson2JsonRedisSerializer();
    }
}
更新时间:2020-12-30 17:23:18

本文由 阿俊 创作,如果您觉得本文不错,请随意赞赏
采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
原文链接:https://jinterest.cn/archives/4-单点登录社交登录springsessionmd
最后更新:2020-12-30 17:23:18

评论

Your browser is out of date!

Update your browser to view this website correctly. Update my browser now

×