电商第十天:
单点登录(SSO):一处登录,处处使用!
登录的发展史:
单一架构:用户登录之后,将用户信息存储在session 中!
分布式架构:用户还是否能存储在 session 中?
不能! session 存在服务器,多个!每个服务器都有自己的session。
认证中心--单独作为一个模块来使用!https://passport.jd.com
将用户存储在哪?
存储用户信息的位置,必须要贯穿于每个项目模块!为了提高项目模块访问速度,则redis 是一个明智之选!
redis
单点登录流程介绍:
token:令牌
1. 先检查cookie 中是否有token
2. true : 已经登录
false: 提示用户登录,跳转到登录页面
2.1 输入用户名,密码跟数据库做比较 ,生成一个令牌token
true:将token 放入cookie!
2.2 只要用户一登录,可以访问任何一个模块!
-------------------------------------------------------------
demo. 动物园:
1. 搭建项目gmall-passport-web
修改配置文件
导入静态文件
编写控制器 测试!
2. 解析index.html
京东:
用户从https://www.jd.com/ 点击到了登录
用户登录https://passport.jd.com/new/login.aspx?ReturnUrl=https%3A%2F%2Fwww.jd.com%2F
https%3A%2F%2Fwww.jd.com%2F
3. 做用户登录
3.1 得到用户的用户名,密码与后台数据进行匹配
3.2 匹配成功之后,将用户信息放入redis
3.3 登录成功之后,制作一个token 并返回给前台页面!
功能开发:
bean,mapper,service,service.impl, controller
3.1 如何利用JWT 制作token
引入jwt
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
3.2 配置nginx.conf
upstream passport.atguigu.com{
server 192.168.67.1:8087;
}
server {
listen 80;
server_name passport.atguigu.com;
location / {
proxy_pass http://passport.atguigu.com;
proxy_set_header X-forwarded-for $proxy_add_x_forwarded_for;
}
}
4. cookie 技术
cookie 与 session 区别!
setDoMain:设置cookie 共享
setPath:设置访问目录
5. 用户的认证:
5.1 利用key,salt 解密token 能够得到用户的信息{userInfo.getId()}
5.2 利用解密出来的userId 去缓存查找一下用户信息是否存在!如果存在,已经登录。每页存在认证失败!
测试:
http://passport.atguigu.com/index?originUrl=http%3A%2F%2Fitem.gmall.com%2F38.html
登录成功之后获取到token
http://item.gmall.com/38.html?newToken=eyJhbGciOiJIUzI1NiJ9.eyJuaWNrTmFtZSI6IkF0Z3VpZ3UiLCJ1c2VySWQiOiIxIn0.XzRrXwDhYywUAFn-ICLJ9t3Xwz7RHo1VVwZZGNdKaaQ
认证:
http://passport.atguigu.com/verify?token=eyJhbGciOiJIUzI1NiJ9.eyJuaWNrTmFtZSI6IkF0Z3VpZ3UiLCJ1c2VySWQiOiIxIn0.XzRrXwDhYywUAFn-ICLJ9t3Xwz7RHo1VVwZZGNdKaaQ¤tIp=192.168.67.1
6. 业务整合
6.1 显示登录之后的用户名
从token 中获取用户名,并保存,到前台页面获取即可!
6.2 如果用户访问需要登录的模块时。用户处于非登录状态应该跳转到登录页面!
7. 验证用户是否需要登录
自定义注解:
测试:usermanage ,manageservice,listservice,passport,itemweb
调试顺序:
断点: String currentIp = request.getHeader("X-forwarded-for");
if ("success".equals(result)){
}
打了断点但是不进断点:
说明:扫描@ComponentScan(basePackages ="com.atguigu.gmall1205")