登录问题
传统登录,保存在session中;解决方案:session共享,问题:用户量大,内存溢出
单点登录
简称sso,sso:在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统
技术实现:
- CAS(免费开源) + SpringSecurity
- redis + cookie
分布式,SSO(single sign on)模式
解决 :
用户身份信息独立管理,更好的分布式管理。
可以自己扩展安全策略
跨域不是问题
缺点:
认证服务器访问压力较大
单点登录执行流程
- 检查cookie中是否有用户认证信息(token)
- 存在,允许进入
- 不存在,重定向到认证中心
- 认证中心;提示用户登录,注册
- 校验用户登录信息
- 失败,重定向到认证中心
- 成功,使用cookie携带用户信息(token)进入应用系统;
- 用户继续访问应用,校验用户信息(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地址,