国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

什么是單點(diǎn)登錄(SSO)

levy9527 / 3119人閱讀

摘要:此時(shí),用戶(hù)想要訪(fǎng)問(wèn)系統(tǒng)受限的資源比如說(shuō)訂單功能,訂單功能需要登錄后才能訪(fǎng)問(wèn),系統(tǒng)發(fā)現(xiàn)用戶(hù)并沒(méi)有登錄,于是重定向到認(rèn)證中心,并將自己的地址作為參數(shù)。

前言
只有光頭才能變強(qiáng)。

文本已收錄至我的GitHub倉(cāng)庫(kù),歡迎Star:https://github.com/ZhongFuCheng3y/3y

在我實(shí)習(xí)之前我就已經(jīng)在看單點(diǎn)登錄的是什么了,但是實(shí)習(xí)的時(shí)候一直在忙其他的事,所以有幾個(gè)網(wǎng)站就一直躺在我的收藏夾里邊:

在前陣子有個(gè)讀者來(lái)我這投稿,是使用JWT實(shí)現(xiàn)單點(diǎn)登錄的(但是文章中并沒(méi)有介紹什么是單點(diǎn)登錄),所以我覺(jué)得是時(shí)候來(lái)整理一下了。

簡(jiǎn)單代碼實(shí)現(xiàn)JWT(json web token)完成SSO單點(diǎn)登錄

一、什么是單點(diǎn)登錄?

單點(diǎn)登錄的英文名叫做:Single Sign On(簡(jiǎn)稱(chēng)SSO)。

初學(xué)/以前的時(shí)候,一般我們就單系統(tǒng),所有的功能都在同一個(gè)系統(tǒng)上。

后來(lái),我們?yōu)榱?strong>合理利用資源和降低耦合性,于是把單系統(tǒng)拆分成多個(gè)子系統(tǒng)。

回顧:分布式基礎(chǔ)知識(shí)

比如阿里系的淘寶和天貓,很明顯地我們可以知道這是兩個(gè)系統(tǒng),但是你在使用的時(shí)候,登錄了天貓,淘寶也會(huì)自動(dòng)登錄。

簡(jiǎn)單來(lái)說(shuō),單點(diǎn)登錄就是在多個(gè)系統(tǒng)中,用戶(hù)只需一次登錄,各個(gè)系統(tǒng)即可感知該用戶(hù)已經(jīng)登錄。

二、回顧單系統(tǒng)登錄

在我初學(xué)JavaWeb的時(shí)候,登錄和注冊(cè)是我做得最多的一個(gè)功能了(初學(xué)Servlet的時(shí)候做過(guò)、學(xué)SpringMVC的時(shí)候做過(guò)、跟著做項(xiàng)目的時(shí)候做過(guò)…),反正我也數(shù)不清我做了多少次登錄和注冊(cè)的功能了...這里簡(jiǎn)單講述一下我們初學(xué)時(shí)是怎么做登錄功能的。

眾所周知,HTTP是無(wú)狀態(tài)的協(xié)議,這意味著服務(wù)器無(wú)法確認(rèn)用戶(hù)的信息。于是乎,W3C就提出了:給每一個(gè)用戶(hù)都發(fā)一個(gè)通行證,無(wú)論誰(shuí)訪(fǎng)問(wèn)的時(shí)候都需要攜帶通行證,這樣服務(wù)器就可以從通行證上確認(rèn)用戶(hù)的信息。通行證就是Cookie。

如果說(shuō)Cookie是檢查用戶(hù)身上的”通行證“來(lái)確認(rèn)用戶(hù)的身份,那么Session就是通過(guò)檢查服務(wù)器上的”客戶(hù)明細(xì)表“來(lái)確認(rèn)用戶(hù)的身份的。Session相當(dāng)于在服務(wù)器中建立了一份“客戶(hù)明細(xì)表”。

HTTP協(xié)議是無(wú)狀態(tài)的,Session不能依據(jù)HTTP連接來(lái)判斷是否為同一個(gè)用戶(hù)。于是乎:服務(wù)器向用戶(hù)瀏覽器發(fā)送了一個(gè)名為JESSIONID的Cookie,它的值是Session的id值。其實(shí)Session是依據(jù)Cookie來(lái)識(shí)別是否是同一個(gè)用戶(hù)。

所以,一般我們單系統(tǒng)實(shí)現(xiàn)登錄會(huì)這樣做:

登錄:將用戶(hù)信息保存在Session對(duì)象中

如果在Session對(duì)象中能查到,說(shuō)明已經(jīng)登錄

如果在Session對(duì)象中查不到,說(shuō)明沒(méi)登錄(或者已經(jīng)退出了登錄)

注銷(xiāo)(退出登錄):從Session中刪除用戶(hù)的信息

記住我(關(guān)閉掉瀏覽器后,重新打開(kāi)瀏覽器還能保持登錄狀態(tài)):配合Cookie來(lái)用

我之前Demo的代碼,可以參考一下:

 /**
 * 用戶(hù)登陸
 */
@PostMapping(value = "/user/session", produces = {"application/json;charset=UTF-8"})
public Result login(String mobileNo, String password, String inputCaptcha, HttpSession session, HttpServletResponse response) {

    //判斷驗(yàn)證碼是否正確
    if (WebUtils.validateCaptcha(inputCaptcha, "captcha", session)) {

        //判斷有沒(méi)有該用戶(hù)
        User user = userService.userLogin(mobileNo, password);
        if (user != null) {
            /*設(shè)置自動(dòng)登陸,一個(gè)星期.  將token保存在數(shù)據(jù)庫(kù)中*/
            String loginToken = WebUtils.md5(new Date().toString() + session.getId());
            user.setLoginToken(loginToken);
            User user1 = userService.userUpload(user);

            session.setAttribute("user", user1);

            CookieUtil.addCookie(response,"loginToken",loginToken,604800);

            return ResultUtil.success(user1);

        } else {
            return ResultUtil.error(ResultEnum.LOGIN_ERROR);
        }
    } else {
        return ResultUtil.error(ResultEnum.CAPTCHA_ERROR);
    }

}

/**
 * 用戶(hù)退出
 */
@DeleteMapping(value = "/session", produces = {"application/json;charset=UTF-8"})
public Result logout(HttpSession session,HttpServletRequest request,HttpServletResponse response ) {

    //刪除session和cookie
    session.removeAttribute("user");

    CookieUtil.clearCookie(request, response, "loginToken");

    return ResultUtil.success();
}
/**
* @author ozc
* @version 1.0
* 

* 攔截器;實(shí)現(xiàn)自動(dòng)登陸功能 */ public class UserInterceptor implements HandlerInterceptor { @Autowired private UserService userService; public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception { User sessionUser = (User) request.getSession().getAttribute("user"); // 已經(jīng)登陸了,放行 if (sessionUser != null) { return true; } else { //得到帶過(guò)來(lái)cookie是否存在 String loginToken = CookieUtil.findCookieByName(request, "loginToken"); if (StringUtils.isNotBlank(loginToken)) { //到數(shù)據(jù)庫(kù)查詢(xún)有沒(méi)有該Cookie User user = userService.findUserByLoginToken(loginToken); if (user != null) { request.getSession().setAttribute("user", user); return true; } else { //沒(méi)有該Cookie與之對(duì)應(yīng)的用戶(hù)(Cookie不匹配) CookieUtil.clearCookie(request, response, "loginToken"); return false; } } else { //沒(méi)有cookie、也沒(méi)有登陸。是index請(qǐng)求獲取用戶(hù)信息,可以放行 if (request.getRequestURI().contains("session")) { return true; } //沒(méi)有cookie憑證 response.sendRedirect("/login.html"); return false; } } } }

總結(jié)一下上面代碼的思路:

用戶(hù)登錄時(shí),驗(yàn)證用戶(hù)的賬戶(hù)和密碼

生成一個(gè)Token保存在數(shù)據(jù)庫(kù)中,將Token寫(xiě)到Cookie中

將用戶(hù)數(shù)據(jù)保存在Session中

請(qǐng)求時(shí)都會(huì)帶上Cookie,檢查有沒(méi)有登錄,如果已經(jīng)登錄則放行

如果沒(méi)看懂的同學(xué),建議回顧Session和Cookie和HTTP:

介紹會(huì)話(huà)技術(shù)、Cookie的API、詳解、應(yīng)用

Session介紹、API、生命周期、應(yīng)用、與Cookie區(qū)別

什么是HTTP

三、多系統(tǒng)登錄的問(wèn)題與解決 3.1 Session不共享問(wèn)題

單系統(tǒng)登錄功能主要是用Session保存用戶(hù)信息來(lái)實(shí)現(xiàn)的,但我們清楚的是:多系統(tǒng)即可能有多個(gè)Tomcat,而Session是依賴(lài)當(dāng)前系統(tǒng)的Tomcat,所以系統(tǒng)A的Session和系統(tǒng)B的Session是不共享的。

解決系統(tǒng)之間Session不共享問(wèn)題有一下幾種方案:

Tomcat集群Session全局復(fù)制(集群內(nèi)每個(gè)tomcat的session完全同步)【會(huì)影響集群的性能呢,不建議】

根據(jù)請(qǐng)求的IP進(jìn)行Hash映射到對(duì)應(yīng)的機(jī)器上(這就相當(dāng)于請(qǐng)求的IP一直會(huì)訪(fǎng)問(wèn)同一個(gè)服務(wù)器)【如果服務(wù)器宕機(jī)了,會(huì)丟失了一大部分Session的數(shù)據(jù),不建議】

把Session數(shù)據(jù)放在Redis中(使用Redis模擬Session)【建議

如果還不了解Redis的同學(xué),建議移步(Redis合集)

我們可以將登錄功能多帶帶抽取出來(lái),做成一個(gè)子系統(tǒng)。

SSO(登錄系統(tǒng))的邏輯如下:

// 登錄功能(SSO多帶帶的服務(wù))
@Override
public TaotaoResult login(String username, String password) throws Exception {
    
    //根據(jù)用戶(hù)名查詢(xún)用戶(hù)信息
    TbUserExample example = new TbUserExample();
    Criteria criteria = example.createCriteria();
    criteria.andUsernameEqualTo(username);
    List list = userMapper.selectByExample(example);
    if (null == list || list.isEmpty()) {
        return TaotaoResult.build(400, "用戶(hù)不存在");
    }
    //核對(duì)密碼
    TbUser user = list.get(0);
    if (!DigestUtils.md5DigestAsHex(password.getBytes()).equals(user.getPassword())) {
        return TaotaoResult.build(400, "密碼錯(cuò)誤");
    }
    //登錄成功,把用戶(hù)信息寫(xiě)入redis
    //生成一個(gè)用戶(hù)token
    String token = UUID.randomUUID().toString();
    jedisCluster.set(USER_TOKEN_KEY + ":" + token, JsonUtils.objectToJson(user));
    //設(shè)置session過(guò)期時(shí)間
    jedisCluster.expire(USER_TOKEN_KEY + ":" + token, SESSION_EXPIRE_TIME);
    return TaotaoResult.ok(token);
}

其他子系統(tǒng)登錄時(shí),請(qǐng)求SSO(登錄系統(tǒng))進(jìn)行登錄,將返回的token寫(xiě)到Cookie中,下次訪(fǎng)問(wèn)時(shí)則把Cookie帶上:

public TaotaoResult login(String username, String password, 
        HttpServletRequest request, HttpServletResponse response) {
    //請(qǐng)求參數(shù)
    Map param = new HashMap<>();
    param.put("username", username);
    param.put("password", password);
    //登錄處理
    String stringResult = HttpClientUtil.doPost(REGISTER_USER_URL + USER_LOGIN_URL, param);
    TaotaoResult result = TaotaoResult.format(stringResult);
    //登錄出錯(cuò)
    if (result.getStatus() != 200) {
        return result;
    }
    //登錄成功后把取token信息,并寫(xiě)入cookie
    String token = (String) result.getData();
    //寫(xiě)入cookie
    CookieUtils.setCookie(request, response, "TT_TOKEN", token);
    //返回成功
    return result;
    
}

總結(jié):

SSO系統(tǒng)生成一個(gè)token,并將用戶(hù)信息存到Redis中,并設(shè)置過(guò)期時(shí)間

其他系統(tǒng)請(qǐng)求SSO系統(tǒng)進(jìn)行登錄,得到SSO返回的token,寫(xiě)到Cookie中

每次請(qǐng)求時(shí),Cookie都會(huì)帶上,攔截器得到token,判斷是否已經(jīng)登錄

到這里,其實(shí)我們會(huì)發(fā)現(xiàn)其實(shí)就兩個(gè)變化:

將登陸功能抽取為一個(gè)系統(tǒng)(SSO),其他系統(tǒng)請(qǐng)求SSO進(jìn)行登錄

本來(lái)將用戶(hù)信息存到Session,現(xiàn)在將用戶(hù)信息存到Redis

3.2 Cookie跨域的問(wèn)題

上面我們解決了Session不能共享的問(wèn)題,但其實(shí)還有另一個(gè)問(wèn)題。Cookie是不能跨域的

比如說(shuō),我們請(qǐng)求時(shí),瀏覽器會(huì)自動(dòng)把google.com的Cookie帶過(guò)去給google的服務(wù)器,而不會(huì)把的Cookie帶過(guò)去給google的服務(wù)器。

這就意味著,由于域名不同,用戶(hù)向系統(tǒng)A登錄后,系統(tǒng)A返回給瀏覽器的Cookie,用戶(hù)再請(qǐng)求系統(tǒng)B的時(shí)候不會(huì)將系統(tǒng)A的Cookie帶過(guò)去。

針對(duì)Cookie存在跨域問(wèn)題,有幾種解決方案:

服務(wù)端將Cookie寫(xiě)到客戶(hù)端后,客戶(hù)端對(duì)Cookie進(jìn)行解析,將Token解析出來(lái),此后請(qǐng)求都把這個(gè)Token帶上就行了

多個(gè)域名共享Cookie,在寫(xiě)到客戶(hù)端的時(shí)候設(shè)置Cookie的domain。

將Token保存在SessionStroage中(不依賴(lài)Cookie就沒(méi)有跨域的問(wèn)題了)

到這里,我們已經(jīng)可以實(shí)現(xiàn)單點(diǎn)登錄了。

3.3 CAS原理

說(shuō)到單點(diǎn)登錄,就肯定會(huì)見(jiàn)到這個(gè)名詞:CAS (Central Authentication Service),下面說(shuō)說(shuō)CAS是怎么搞的。

如果已經(jīng)將登錄多帶帶抽取成系統(tǒng)出來(lái),我們還能這樣玩?,F(xiàn)在我們有兩個(gè)系統(tǒng),分別是www.java3y.comwww.java4y.com,一個(gè)SSOwww.sso.com

首先,用戶(hù)想要訪(fǎng)問(wèn)系統(tǒng)Awww.java3y.com受限的資源(比如說(shuō)購(gòu)物車(chē)功能,購(gòu)物車(chē)功能需要登錄后才能訪(fǎng)問(wèn)),系統(tǒng)Awww.java3y.com發(fā)現(xiàn)用戶(hù)并沒(méi)有登錄,于是重定向到sso認(rèn)證中心,并將自己的地址作為參數(shù)。請(qǐng)求的地址如下:

www.sso.com?service=www.java3y.com

sso認(rèn)證中心發(fā)現(xiàn)用戶(hù)未登錄,將用戶(hù)引導(dǎo)至登錄頁(yè)面,用戶(hù)進(jìn)行輸入用戶(hù)名和密碼進(jìn)行登錄,用戶(hù)與認(rèn)證中心建立全局會(huì)話(huà)(生成一份Token,寫(xiě)到Cookie中,保存在瀏覽器上)

隨后,認(rèn)證中心重定向回系統(tǒng)A,并把Token攜帶過(guò)去給系統(tǒng)A,重定向的地址如下:

www.java3y.com?token=xxxxxxx

接著,系統(tǒng)A去sso認(rèn)證中心驗(yàn)證這個(gè)Token是否正確,如果正確,則系統(tǒng)A和用戶(hù)建立局部會(huì)話(huà)(創(chuàng)建Session)。到此,系統(tǒng)A和用戶(hù)已經(jīng)是登錄狀態(tài)了。

此時(shí),用戶(hù)想要訪(fǎng)問(wèn)系統(tǒng)Bwww.java4y.com受限的資源(比如說(shuō)訂單功能,訂單功能需要登錄后才能訪(fǎng)問(wèn)),系統(tǒng)Bwww.java4y.com發(fā)現(xiàn)用戶(hù)并沒(méi)有登錄,于是重定向到sso認(rèn)證中心,并將自己的地址作為參數(shù)。請(qǐng)求的地址如下:

www.sso.com?service=www.java4y.com

注意,因?yàn)橹坝脩?hù)與認(rèn)證中心www.sso.com已經(jīng)建立了全局會(huì)話(huà)(當(dāng)時(shí)已經(jīng)把Cookie保存到瀏覽器上了),所以這次系統(tǒng)B重定向到認(rèn)證中心www.sso.com是可以帶上Cookie的。

認(rèn)證中心根據(jù)帶過(guò)來(lái)的Cookie發(fā)現(xiàn)已經(jīng)與用戶(hù)建立了全局會(huì)話(huà)了,認(rèn)證中心重定向回系統(tǒng)B,并把Token攜帶過(guò)去給系統(tǒng)B,重定向的地址如下:

www.java4y.com?token=xxxxxxx

接著,系統(tǒng)B去sso認(rèn)證中心驗(yàn)證這個(gè)Token是否正確,如果正確,則系統(tǒng)B和用戶(hù)建立局部會(huì)話(huà)(創(chuàng)建Session)。到此,系統(tǒng)B和用戶(hù)已經(jīng)是登錄狀態(tài)了。

看到這里,其實(shí)SSO認(rèn)證中心就類(lèi)似一個(gè)中轉(zhuǎn)站。

參考資料:

https://www.cnblogs.com/Ezrea...

http://www.cnblogs.com/ywlake...

https://blog.csdn.net/javalov...

最后
樂(lè)于輸出干貨的Java技術(shù)公眾號(hào):Java3y。公眾號(hào)內(nèi)有200多篇原創(chuàng)技術(shù)文章、海量視頻資源、精美腦圖,關(guān)注即可獲??!

覺(jué)得我的文章寫(xiě)得不錯(cuò),點(diǎn)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/77714.html

相關(guān)文章

  • 什么單點(diǎn)登錄(SSO)

    摘要:此時(shí),用戶(hù)想要訪(fǎng)問(wèn)系統(tǒng)受限的資源比如說(shuō)訂單功能,訂單功能需要登錄后才能訪(fǎng)問(wèn),系統(tǒng)發(fā)現(xiàn)用戶(hù)并沒(méi)有登錄,于是重定向到認(rèn)證中心,并將自己的地址作為參數(shù)。前言 只有光頭才能變強(qiáng)。 文本已收錄至我的GitHub倉(cāng)庫(kù),歡迎Star:github.com/ZhongFuChen… 在我實(shí)習(xí)之前我就已經(jīng)在看單點(diǎn)登錄的是什么了,但是實(shí)習(xí)的時(shí)候一直在忙其他的事,所以有幾個(gè)網(wǎng)站就一直躺在我的收藏夾里邊: ...

    番茄西紅柿 評(píng)論0 收藏0
  • 什么單點(diǎn)登錄(SSO)

    摘要:此時(shí),用戶(hù)想要訪(fǎng)問(wèn)系統(tǒng)受限的資源比如說(shuō)訂單功能,訂單功能需要登錄后才能訪(fǎng)問(wèn),系統(tǒng)發(fā)現(xiàn)用戶(hù)并沒(méi)有登錄,于是重定向到認(rèn)證中心,并將自己的地址作為參數(shù)。前言 只有光頭才能變強(qiáng)。 文本已收錄至我的GitHub倉(cāng)庫(kù),歡迎Star:github.com/ZhongFuChen… 在我實(shí)習(xí)之前我就已經(jīng)在看單點(diǎn)登錄的是什么了,但是實(shí)習(xí)的時(shí)候一直在忙其他的事,所以有幾個(gè)網(wǎng)站就一直躺在我的收藏夾里邊: ...

    番茄西紅柿 評(píng)論0 收藏0
  • 什么單點(diǎn)登錄(SSO)

    摘要:此時(shí),用戶(hù)想要訪(fǎng)問(wèn)系統(tǒng)受限的資源比如說(shuō)訂單功能,訂單功能需要登錄后才能訪(fǎng)問(wèn),系統(tǒng)發(fā)現(xiàn)用戶(hù)并沒(méi)有登錄,于是重定向到認(rèn)證中心,并將自己的地址作為參數(shù)。前言 只有光頭才能變強(qiáng)。 文本已收錄至我的GitHub倉(cāng)庫(kù),歡迎Star:github.com/ZhongFuChen… 在我實(shí)習(xí)之前我就已經(jīng)在看單點(diǎn)登錄的是什么了,但是實(shí)習(xí)的時(shí)候一直在忙其他的事,所以有幾個(gè)網(wǎng)站就一直躺在我的收藏夾里邊: ...

    2i18ns 評(píng)論0 收藏0
  • 系統(tǒng)的講解 - SSO單點(diǎn)登錄

    摘要:概念英文全稱(chēng),單點(diǎn)登錄。登錄如上述流程圖一致。系統(tǒng)和系統(tǒng)使用認(rèn)證登錄。退出上圖,表示的是從某一個(gè)系統(tǒng)退出的流程圖。與的關(guān)系如果企業(yè)有多個(gè)管理系統(tǒng),現(xiàn)由原來(lái)的每個(gè)系統(tǒng)都有一個(gè)登錄,調(diào)整為統(tǒng)一登錄認(rèn)證。 概念 SSO 英文全稱(chēng) Single Sign On,單點(diǎn)登錄。 在多個(gè)應(yīng)用系統(tǒng)中,只需要登錄一次,就可以訪(fǎng)問(wèn)其他相互信任的應(yīng)用系統(tǒng)。 比如:淘寶網(wǎng)(www.taobao.com),天貓網(wǎng)...

    Kylin_Mountain 評(píng)論0 收藏0
  • SSO單點(diǎn)登錄原理

    摘要:經(jīng)紀(jì)人給被用于進(jìn)一步請(qǐng)求的電子身份存取?;诰W(wǎng)關(guān)基于,安全斷言標(biāo)記語(yǔ)言的出現(xiàn)大大簡(jiǎn)化了,并被批準(zhǔn)為的執(zhí)行標(biāo)準(zhǔn)。 什么是SSO? 單點(diǎn)登錄( Single Sign-On , 簡(jiǎn)稱(chēng) SSO )是目前比較流行的服務(wù)于企業(yè)業(yè)務(wù)整合的解決方案之一 SSO 使得在多個(gè)應(yīng)用系統(tǒng)中,用戶(hù)只需要 登錄一次 就可以訪(fǎng)問(wèn)所有相互信任的應(yīng)用系統(tǒng) SSO 主要實(shí)現(xiàn)方式 共享 cookies 基于共享同域的...

    curried 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<