单点登录


登录问题

传统登录,保存在session中;解决方案:session共享,问题:用户量大,内存溢出

单点登录

简称sso,sso:在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统

技术实现:

  • CAS(免费开源) + SpringSecurity
  • redis + cookie

分布式,SSO(single sign on)模式
解决 :
用户身份信息独立管理,更好的分布式管理。
可以自己扩展安全策略
跨域不是问题

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

单点登录执行流程

  1. 检查cookie中是否有用户认证信息(token)
  • 存在,允许进入
  • 不存在,重定向到认证中心
  1. 认证中心;提示用户登录,注册
  2. 校验用户登录信息
  • 失败,重定向到认证中心
  • 成功,使用cookie携带用户信息(token)进入应用系统;
  1. 用户继续访问应用,校验用户信息(token)是否正确
  • 不正确,重定向到认证中心
  • 正确,允许访问

登录功能实现:

查询用户表, 把用户名和密码作为查询条件, 能查询出内容,说明登录成功,失败
select * from user_info where login_name = “cctv” and passwd = “96e79218965eb72c92a549dd5a330112”

UserInfo userinfo = userService.login(loginName,password);
if(userinfo!=null){
    登录成功
}else{
    登录失败
}

 
退出登录:
   http://api.gmall.com/api/user/passport/logout
   
   cookie中的信息删掉,删除到redis中的信息   

你们单点登录怎么实现?
cookie +redis 实现的单点登录
如果cookie禁用了可以使用另外一个客户端的存储,
location
storage.
APP端移动端, 也有存储客户数据的位置, location或者

用了cookie,跨域怎么解决的?
设置domain,域名降级

单点登录与网关整合:

判断哪些必须要登录的, 判断URL需要登录   

a. trade.html 用户订单页面, 要求他必须登录

b.用户访问的时候, 访问内部接口的时候是不允许直接访问api/product/inner/getSkuInfo/{skuId}

c.下订单的时候,可能访问到的URL
api//order/ 也需要登录

  以上这些业务处理,就得在网关中进行处理, 过滤器

面试题:
场景题,如何判断用户两次访问的ip地址都是同一个IP地址?

    key值就是 token值.
    
    用户第一次访问的时候把ip存入到redis一份
    第二次再访问的时候,取出当前访问的客户ip地址,与redis中进行对比,如果一致,
    说明是同一个ip地址,
 

文章作者: zrh
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 zrh !
  目录