何爲單點登陸?

今天看到一篇文章,和單點登陸有關係,記得有一次課堂答辯,有同窗提到了單點登陸這個詞,我問了一句,老師要求我寫一篇關於單點登錄的博客,今天終於有機會了。java

什麼是單點登陸?單點登陸全稱Single Sign On(如下簡稱SSO),是指在多系統應用羣中登陸一個系統,即可在其餘全部系統中獲得受權而無需再次登陸,包括單點登陸與單點註銷兩部分。安全

相比於單系統登陸,sso須要一個獨立的認證中心,只有認證中心能接受用戶的用戶名密碼等安全信息,其餘系統不提供登陸入口,只接受認證中心的間接受權。間接受權經過令牌實現,sso認證中心驗證用戶的用戶名密碼沒問題,建立受權令牌,在接下來的跳轉過程當中,受權令牌做爲參數發送給各個子系統,子系統拿到令牌,即獲得了受權,能夠藉此建立局部會話,局部會話登陸方式與單系統的登陸方式相同。這個過程,也就是單點登陸的原理。session

只是簡要介紹下基於java的實現過程,不提供完整源碼,明白了原理,我相信大家能夠本身實現。sso採用客戶端/服務端架構,咱們先看sso-client與sso-server要實現的功能(下面:sso認證中心=sso-server)。架構

 

sso-clientapp

 

  1. 攔截子系統未登陸用戶請求,跳轉至sso認證中心;
  2. 接收並存儲sso認證中心發送的令牌;
  3. 與sso-server通訊,校驗令牌的有效性;
  4. 創建局部會話;
  5. 攔截用戶註銷請求,向sso認證中心發送註銷請求;
  6. 接收sso認證中心發出的註銷請求,銷燬局部會話。

 

sso-serverdom

 

  1. 驗證用戶的登陸信息;
  2. 建立全局會話;
  3. 建立受權令牌;
  4. 與sso-client通訊發送令牌;
  5. 校驗sso-client令牌有效性;
  6. 系統註冊;
  7. 接收sso-client註銷請求,註銷全部會話。

接下來,咱們按照原理來一步步實現sso吧!this

一、sso-client攔截未登陸請求url

Java攔截請求的方式有servlet、filter、listener三種方式,咱們採用filter。在sso-client中新建LoginFilter.java類並實現Filter接口,在doFilter()方法中加入對未登陸用戶的攔截server

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");}token

二、sso-server攔截未登陸請求

攔截從sso-client跳轉至sso認證中心的未登陸請求,跳轉至登陸頁面,這個過程與sso-client徹底同樣。

三、sso-server驗證用戶登陸信息

用戶在登陸頁面輸入用戶名密碼,請求登陸,sso認證中心校驗用戶信息,校驗成功,將會話狀態標記爲「已登陸」。

@RequestMapping("/login")public String login(String username, String password, HttpServletRequest req) {    this.checkLoginInfo(username, password);    req.getSession().setAttribute("isLogin", true);    return "success";}

 

四、sso-server建立受權令牌

 

受權令牌是一串隨機字符,以什麼樣的方式生成都沒有關係,只要不重複、不易僞造便可,下面是一個例子。

 

  •  

String token = UUID.randomUUID().toString();

 

五、sso-client取得令牌並校驗

 

sso認證中心登陸後,跳轉回子系統並附上令牌,子系統(sso-client)取得令牌,而後去sso認證中心校驗,在LoginFilter.java的doFilter()中添加幾行。

 

 

// 請求附帶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);}

 

verify()方法使用httpClient實現,這裏僅簡略介紹,httpClient詳細使用方法請參考官方文檔。

 

HttpPost httpPost = new HttpPost("sso-server-verify-url-with-token");HttpResponse httpResponse = httpClient.execute(httpPost);

相關文章
相關標籤/搜索