- 场景描述
基本上所有的网站,你只需要登录一次,一定的时间内再访问网站中的所有页面都不会让你再登录,用户体验不错,这就单点登录。
- 问题
1、服务端怎么知道你已经登陆的呢?
很显然,登录之后,服务端应该给客户端发个通行证,下次客户端再请求的时候带上通行证,服务端一看有通行证,直接放行,这就是单点登录的解决思路。
2、具体怎么实现呢?
基于session实现:用户登录之后,服务端创建一个session放入用户信息,并将该session的唯一标识sessionId放在cookie中返回给客户端,客户端下次请求时自动带上sessionId,服务端根据sessionId拿到session再拿到用户信息即可。
这种方式的缺点有:依赖于服务端保存用户信息,占用服务端内存,服务端不易拓展,跨域访问资源无法认证登录状态,cookie存储sessionId易遭到CRSF跨站请求伪造攻击
基于token实现:用户登录之后,服务端将用户信息加密生成一个令牌token,将令牌返回到客户端 ,客户端保存到local storage中(保存到cookie中方便但不够安全,看实际情况需要),下次请求时带上,服务端对令牌解密查询用户信息即可,关于查询用户信息,可以直接查数据库,但是最好加个用户信息缓存效率高点。
这种方式的优点是:不依赖于服务端存储用户信息,服务端易拓展等,缺点就是端存储数据大小受限制,适用于只有少量token数据的情况
3、为什么要设置过期时间?过期时间设置多少?到了过期时间一定过期吗?
单点登录只是为了用户一定时间内访问网站的用户体验更好,基于安全考虑,一定要设过期时间的,不然拿到token和拿到账号密码岂不是没什么两样了,用户登出时也要及时使token失效的。
过期时间通常以小时为单位,比较敏感的网站,可能会短一些;
第一次创建令牌并设置过期时间之后,如果用户一直在访问系统,那么,过期时间应该动态更新,过期时间应该是用户不再访问系统多长时间之后过期。
4、保存在内存还是缓存中?
我们说用户登录状态其实算是热点数据了,每发一个请求都要获取的,但是,需不需要缓存还得看具体的用户量,如果就几个用户,登录状态放在内存也完全没什么压力,用不着去做缓存,反之,如果用户登录状态在内存中给系统造成了较大的压力,那么可以考虑用缓存来优化。
5、是不是所有的请求都要做登录验证?
很明显,我们访问系统的登录界面是不需要登录验证的,可能还有一些系统介绍的页面,是没有用户权限限制的。
那么,有些请求需要验证,而有些又不需要,登录验证又是一个公共逻辑,该怎么处理呢?
那么,我们就需要利用过滤器Filter或拦截器Interceptor将不需要验证的请求过滤拦截掉,需要验证的,利用过滤器或拦截器,进行登录验证即可。
2424

被折叠的 条评论
为什么被折叠?



