复习提要:
以前的单点登录是把token保存在同一个域名下面。
现在是生产者和消费者的关系
文章目录
概念
对于单个系统来说认证是很简单,但是对于多个系统来说认证是困难的。如果仅用cookie的域存储来实现会造成较大的难度,比如说系统的跨语言,跨平台等。
所以我们建立SSO统一管理,用Server来监管所有属于同一系统的域系统。
sso-client(所有子系统都应该拥有)
- 拦截子系统未登录用户请求,跳转至sso认证中心
- 接收并存储sso认证中心发送的令牌
- 与sso-server通信,校验令牌的有效性
- 建立局部会话
- 拦截用户注销请求,向sso认证中心发送注销请求
- 接收sso认证中心发出的注销请求,销毁局部会话
sso-server
- 验证用户的登录信息
- 创建全局会话
- 创建授权令牌
- 与sso-client通信发送令牌
- 校验sso-client令牌有效性
- 系统注册
- 接收sso-client注销请求,注销所有会话
实现流程
1 .在子页面创建登录或许注册拦截,引导进入server系统,并发送系统标识(一般为系统域名)
2.在server页面进行登录,注册操作。生成cookie信息,返回token认证。
3.在跳转其他系统需要进行登录时候,传入token和系统标识到server系统,如果已经认证,则返回登录信息。
注解:sso提高统一的登录和注册页面,其他子系统可以不写注册和登录
具体实现<可忽略不看>
1.client创建拦截
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
HttpSession session = req.getSession();
if (session.getAttribute("isLogin")) {
chain.doFilter(request, response);
return;
}
*//跳转至sso认证中心*
res.sendRedirect("sso-server-url-with-system-url");
}
2.server创建拦截
同上
3. 进行登录认证
@RequestMapping("/login")
public String login(String username, String password, HttpServletRequest req) {
this.checkLoginInfo(username, password);
req.getSession().setAttribute("isLogin", true);
return "success";
}
4.生成token
String token = UUID.randomUUID().toString();
注解:token存在redis里面,通常value为用户信息
5.client收到请求校验token
// 请求附带token参数
String token = req.getParameter("token");
if (token != null) {
// 去sso认证中心校验token
boolean verifyResult = this.verify("sso-server-verify-url", token);
if (!verifyResult) {
res.sendRedirect("sso-server-url");
return;
}
chain.doFilter(request, response);
}
6.server 处理子系统请求
7.client校验成功以后创建局部对话
if (verifyResult) {
session.setAttribute("isLogin", true);
}
8.注销过程
1.cilent 发送logout请求
//client
String logout = req.getParameter("logout");
if (logout != null) {
this.ssoServer.logout(token);
}
//server
@RequestMapping("/logout")
public String logout(HttpServletRequest req) {
HttpSession session = req.getSession();
if (session != null) {
session.invalidate();//触发LogoutListener
}
return "redirect:/";
}
2.server发送全局注销
sso认证中心有一个全局会话的监听器,一旦全局会话注销,将通知所有注册系统注销。
版权声明:本文为xxf_is_girl_gad原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。