做者 | 凌承一
php
连接 | cnblogs.com/ywlaker/p/6113927.htmlhtml


-
请求参数 -
cookie

HttpSession session = request.getSession();
session.setAttribute("isLogin", true);
用户再次访问时,tomcat在会话对象中查看登陆状态java
HttpSession session = request.getSession();
session.getAttribute("isLogin");





-
用户访问系统1的受保护资源,系统1发现用户未登陆,跳转至sso认证中心,并将本身的地址做为参数 -
sso认证中心发现用户未登陆,将用户引导至登陆页面 -
用户输入用户名密码提交登陆申请 -
sso认证中心校验用户信息,建立用户与sso认证中心之间的会话,称为全局会话,同时建立受权令牌 -
sso认证中心带着令牌跳转会最初的请求地址(系统1) -
系统1拿到令牌,去sso认证中心校验令牌是否有效 -
sso认证中心校验令牌,返回有效,注册系统1 -
系统1使用该令牌建立与用户的会话,称为局部会话,返回受保护资源 -
用户访问系统2的受保护资源 -
系统2发现用户未登陆,跳转至sso认证中心,并将本身的地址做为参数 -
sso认证中心发现用户已登陆,跳转回系统2的地址,并附上令牌 -
系统2拿到令牌,去sso认证中心校验令牌是否有效 -
sso认证中心校验令牌,返回有效,注册系统2 -
系统2使用该令牌建立与用户的局部会话,返回受保护资源
-
局部会话存在,全局会话必定存在 -
全局会话存在,局部会话不必定存在 -
全局会话销毁,局部会话必须销毁

-
用户向系统1发起注销请求 -
系统1根据用户与系统1创建的会话id拿到令牌,向sso认证中心发起注销请求 -
sso认证中心校验令牌有效,销毁全局会话,同时取出全部用此令牌注册的系统地址 -
sso认证中心向全部注册系统发起注销请求 -
各注册系统接收sso认证中心的注销请求,销毁局部会话 -
sso认证中心引导用户至登陆页面

-
拦截子系统未登陆用户请求,跳转至sso认证中心 -
接收并存储sso认证中心发送的令牌 -
与sso-server通讯,校验令牌的有效性 -
创建局部会话 -
拦截用户注销请求,向sso认证中心发送注销请求 -
接收sso认证中心发出的注销请求,销毁局部会话
-
验证用户的登陆信息 -
建立全局会话 -
建立受权令牌 -
与sso-client通讯发送令牌 -
校验sso-client令牌有效性 -
系统注册 -
接收sso-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");
}
@RequestMapping("/login")
public String login(String username, String password, HttpServletRequest req) {
this.checkLoginInfo(username, password);
req.getSession().setAttribute("isLogin", true);
return "success";
}
String token = UUID.randomUUID().toString();
// 请求附带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);
}
HttpPost httpPost = new HttpPost("sso-server-verify-url-with-token");
HttpResponse httpResponse = httpClient.execute(httpPost);

if (verifyResult) {
session.setAttribute("isLogin", true);
}
String logout = req.getParameter("logout");
if (logout != null) {
this.ssoServer.logout(token);
}
@RequestMapping("/logout")
public String logout(HttpServletRequest req) {
HttpSession session = req.getSession();
if (session != null) {
session.invalidate();//触发LogoutListener
}
return "redirect:/";
}
sso认证中心有一个全局会话的监听器,一旦全局会话注销,将通知全部注册系统注销程序员
public class LogoutListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent event) {}
@Override
public void sessionDestroyed(HttpSessionEvent event) {
//经过httpClient向全部注册系统发送注销请求
}
}
点下面
给个在看呗
本文分享自微信公众号 - 程序员汇聚地(chasays)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。web