SSO<单点登录>_2021年8月11日更新

复习提要:
以前的单点登录是把token保存在同一个域名下面。
现在是生产者和消费者的关系

概念

对于单个系统来说认证是很简单,但是对于多个系统来说认证是困难的。如果仅用cookie的域存储来实现会造成较大的难度,比如说系统的跨语言,跨平台等。

所以我们建立SSO统一管理,用Server来监管所有属于同一系统的域系统。

sso-client(所有子系统都应该拥有)

  1. 拦截子系统未登录用户请求,跳转至sso认证中心
  2. 接收并存储sso认证中心发送的令牌
  3. 与sso-server通信,校验令牌的有效性
  4. 建立局部会话
  5. 拦截用户注销请求,向sso认证中心发送注销请求
  6. 接收sso认证中心发出的注销请求,销毁局部会话

sso-server

  1. 验证用户的登录信息
  2. 创建全局会话
  3. 创建授权令牌
  4. 与sso-client通信发送令牌
  5. 校验sso-client令牌有效性
  6. 系统注册
  7. 接收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认证中心有一个全局会话的监听器,一旦全局会话注销,将通知所有注册系统注销。

Guess you like

Origin blog.csdn.net/xxf_is_girl_gad/article/details/119599901