日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

告別繁瑣操作,實(shí)現(xiàn)一次登錄產(chǎn)品互通

來源: 責(zé)編: 時(shí)間:2024-09-10 09:50:55 115觀看
導(dǎo)讀最近開發(fā)新產(chǎn)品,然后老板說我們現(xiàn)在系統(tǒng)太多了,每次切換系統(tǒng)登錄太麻煩了,能不能做個(gè)優(yōu)化,同一賬號(hào)互通掉。作為一個(gè)資深架構(gòu)獅,老板的要求肯定要滿足,安排!一個(gè)公司產(chǎn)品矩陣比較豐富的時(shí)候,用戶在不同系統(tǒng)之間來回切換,固然對(duì)

最近開發(fā)新產(chǎn)品,然后老板說我們現(xiàn)在系統(tǒng)太多了,每次切換系統(tǒng)登錄太麻煩了,能不能做個(gè)優(yōu)化,同一賬號(hào)互通掉。作為一個(gè)資深架構(gòu)獅,老板的要求肯定要滿足,安排!5U228資訊網(wǎng)——每日最新資訊28at.com

一個(gè)公司產(chǎn)品矩陣比較豐富的時(shí)候,用戶在不同系統(tǒng)之間來回切換,固然對(duì)產(chǎn)品用戶體驗(yàn)上較差,并且增加用戶密碼管理成本。也沒有很好地利用內(nèi)部流量進(jìn)行用戶打通,并且每個(gè)產(chǎn)品的獨(dú)立體系會(huì)導(dǎo)致產(chǎn)品安全度下降。5U228資訊網(wǎng)——每日最新資訊28at.com

因此實(shí)現(xiàn)集團(tuán)產(chǎn)品的單點(diǎn)登錄對(duì)用戶使用體驗(yàn)以及效率提升有很大的幫助。那么如何實(shí)現(xiàn)統(tǒng)一認(rèn)證呢?我們先了解一下傳統(tǒng)的身份驗(yàn)證方式。5U228資訊網(wǎng)——每日最新資訊28at.com

1 傳統(tǒng)Session機(jī)制及身份認(rèn)證方案

1.1 Cookie與服務(wù)器的交互

圖片圖片5U228資訊網(wǎng)——每日最新資訊28at.com

眾所周知,http是無狀態(tài)的協(xié)議,因此客戶每次通過瀏覽器訪問web頁面,請(qǐng)求到服務(wù)端時(shí),服務(wù)器都會(huì)新建線程,打開新的會(huì)話,而且服務(wù)器也不會(huì)自動(dòng)維護(hù)客戶的上下文信息。比如我們現(xiàn)在要實(shí)現(xiàn)一個(gè)電商內(nèi)的購(gòu)物車功能,要怎么才能知道哪些購(gòu)物車請(qǐng)求對(duì)應(yīng)的是來自同一個(gè)客戶的請(qǐng)求呢?5U228資訊網(wǎng)——每日最新資訊28at.com

圖片圖片5U228資訊網(wǎng)——每日最新資訊28at.com

因?yàn)?http 請(qǐng)求是無狀態(tài)請(qǐng)求,所以在 Web 領(lǐng)域,大部分都是通過這種方式解決。但是這么做有什么問題呢?我們接著看5U228資訊網(wǎng)——每日最新資訊28at.com

2 集群環(huán)境下的 Session 困境及解決方案

圖片圖片5U228資訊網(wǎng)——每日最新資訊28at.com

隨著技術(shù)的發(fā)展,用戶流量增大,單個(gè)服務(wù)器已經(jīng)不能滿足系統(tǒng)的需要了,分布式架構(gòu)開始流行。通常都會(huì)把系統(tǒng)部署在多臺(tái)服務(wù)器上,通過負(fù)載均衡把請(qǐng)求分發(fā)到其中的一臺(tái)服務(wù)器上,這樣很可能同一個(gè)用戶的請(qǐng)求被分發(fā)到不同的服務(wù)器上,因?yàn)?session 是保存在服務(wù)器上的,那么很有可能第一次請(qǐng)求訪問的 A 服務(wù)器,創(chuàng)建了 session,但是第二次訪問到了 B 服務(wù)器,這時(shí)就會(huì)出現(xiàn)取不到 session 的情況。5U228資訊網(wǎng)——每日最新資訊28at.com

我們知道,Session 一般是用來存會(huì)話全局的用戶信息(不僅僅是登陸方面的問題),用來簡(jiǎn)化/加速后續(xù)的業(yè)務(wù)請(qǐng)求。5U228資訊網(wǎng)——每日最新資訊28at.com

傳統(tǒng)的 session 由服務(wù)器端生成并存儲(chǔ),當(dāng)應(yīng)用進(jìn)行分布式集群部署的時(shí)候,如何保證不同服務(wù)器上 session 信息能夠共享呢?5U228資訊網(wǎng)——每日最新資訊28at.com

2.1 Session共享方案

Session共享一般有兩種思路5U228資訊網(wǎng)——每日最新資訊28at.com

  • session復(fù)制
  • session集中存儲(chǔ)
2.1.1 session復(fù)制

session復(fù)制即將不同服務(wù)器上 session 數(shù)據(jù)進(jìn)行復(fù)制,用戶登錄,修改,注銷時(shí),將session信息同時(shí)也復(fù)制到其他機(jī)器上面去5U228資訊網(wǎng)——每日最新資訊28at.com

圖片圖片5U228資訊網(wǎng)——每日最新資訊28at.com

這種實(shí)現(xiàn)的問題就是實(shí)現(xiàn)成本高,維護(hù)難度大,并且會(huì)存在延遲登問題。5U228資訊網(wǎng)——每日最新資訊28at.com

2.1.2 session集中存儲(chǔ)

圖片圖片5U228資訊網(wǎng)——每日最新資訊28at.com

集中存儲(chǔ)就是將獲取session單獨(dú)放在一個(gè)服務(wù)中進(jìn)行存儲(chǔ),所有獲取session的統(tǒng)一來這個(gè)服務(wù)中去取。這樣就避免了同步和維護(hù)多套session的問題。一般我們都是使用redis進(jìn)行集中式存儲(chǔ)session。5U228資訊網(wǎng)——每日最新資訊28at.com

3 多服務(wù)下的登陸困境及SSO方案

3.1 SSO的產(chǎn)生背景

圖片圖片5U228資訊網(wǎng)——每日最新資訊28at.com

如果企業(yè)做大了之后,一般都有很多的業(yè)務(wù)支持系統(tǒng)為其提供相應(yīng)的管理和 IT 服務(wù),按照傳統(tǒng)的驗(yàn)證方式訪問多系統(tǒng),每個(gè)單獨(dú)的系統(tǒng)都會(huì)有自己的安全體系和身份認(rèn)證系統(tǒng)。進(jìn)入每個(gè)系統(tǒng)都需要進(jìn)行登錄,獲取session,再通過session訪問對(duì)應(yīng)系統(tǒng)資源。5U228資訊網(wǎng)——每日最新資訊28at.com

這樣的局面不僅給管理上帶來了很大的困難,對(duì)客戶來說也極不友好,那么如何讓客戶只需登陸一次,就可以進(jìn)入多個(gè)系統(tǒng),而不需要重新登錄呢?5U228資訊網(wǎng)——每日最新資訊28at.com

圖片圖片5U228資訊網(wǎng)——每日最新資訊28at.com

“單點(diǎn)登錄”就是專為解決此類問題的。其大致思想流程如下:通過一個(gè) ticket 進(jìn)行串接各系統(tǒng)間的用戶信息5U228資訊網(wǎng)——每日最新資訊28at.com

3.2 SSO的底層原理 CAS

3.2.1 CAS實(shí)現(xiàn)單點(diǎn)登錄流程

我們知道對(duì)于完全不同域名的系統(tǒng),cookie 是無法跨域名共享的,因此 sessionId 在頁面端也無法共享,因此需要實(shí)現(xiàn)單店登錄,就需要啟用一個(gè)專門用來登錄的域名如(ouath.com)來提供所有系統(tǒng)的sessionId。當(dāng)業(yè)務(wù)系統(tǒng)被打開時(shí),借助中心授權(quán)系統(tǒng)進(jìn)行登錄,整體流程如下:5U228資訊網(wǎng)——每日最新資訊28at.com

  1. 當(dāng)b.com打開時(shí),發(fā)現(xiàn)自己未登陸,于是跳轉(zhuǎn)到ouath.com去登陸
  2. ouath.com登陸頁面被打開,用戶輸入帳戶/密碼登陸成功
  3. ouath.com登陸成功,種 cookie 到ouath.com域名下
  4. 把 sessionid 放入后臺(tái)redis,存放<ticket,sesssionid>數(shù)據(jù)結(jié)構(gòu),然后頁面重定向到A系統(tǒng)
  5. 當(dāng)b.com重新被打開,發(fā)現(xiàn)仍然是未登陸,但是有了一個(gè) ticket值
  6. 當(dāng)b.com用ticket 值,到 redis 里查到 sessionid,并做 session 同步,然后種cookie給自己,頁面原地重定向
  7. 當(dāng)b.com打開自己頁面,此時(shí)有了 cookie,后臺(tái)校驗(yàn)登陸狀態(tài),成功

整個(gè)交互流程圖如下:5U228資訊網(wǎng)——每日最新資訊28at.com

圖片圖片5U228資訊網(wǎng)——每日最新資訊28at.com

3.2.2 單點(diǎn)登錄流程演示

3.2.2.1 CAS登錄服務(wù)demo核心代碼5U228資訊網(wǎng)——每日最新資訊28at.com

  • 用戶實(shí)體類
public class UserForm implements Serializable{private static final long serialVersionUID = 1L;private String username;private String password;private String backurl;public String getUsername() {    return username;}public void setUsername(String username) {    this.username = username;}public String getPassword() {    return password;}public void setPassword(String password) {    this.password = password;}public String getBackurl() {    return backurl;}public void setBackurl(String backurl) {    this.backurl = backurl;}}
  • 登錄控制器
@Controllerpublic class IndexController {    @Autowired    private RedisTemplate redisTemplate;@GetMapping("/toLogin")public String toLogin(Model model,HttpServletRequest request) {    Object userInfo = request.getSession().getAttribute(LoginFilter.USER_INFO);    //不為空,則是已登陸狀態(tài)    if (null != userInfo){        String ticket = UUID.randomUUID().toString();        redisTemplate.opsForValue().set(ticket,userInfo,2, TimeUnit.SECONDS);        return "redirect:"+request.getParameter("url")+"?ticket="+ticket;    }    UserForm user = new UserForm();    user.setUsername("laowang");    user.setPassword("laowang");    user.setBackurl(request.getParameter("url"));    model.addAttribute("user", user);    return "login";}@PostMapping("/login")public void login(@ModelAttribute UserForm user,HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException {    System.out.println("backurl:"+user.getBackurl());    request.getSession().setAttribute(LoginFilter.USER_INFO,user);    //登陸成功,創(chuàng)建用戶信息票據(jù)    String ticket = UUID.randomUUID().toString();    redisTemplate.opsForValue().set(ticket,user,20, TimeUnit.SECONDS);    //重定向,回原url  ---a.com    if (null == user.getBackurl() || user.getBackurl().length()==0){        response.sendRedirect("/index");    } else {        response.sendRedirect(user.getBackurl()+"?ticket="+ticket);    }}@GetMapping("/index")public ModelAndView index(HttpServletRequest request) {    ModelAndView modelAndView = new ModelAndView();    Object user = request.getSession().getAttribute(LoginFilter.USER_INFO);    UserForm userInfo = (UserForm) user;    modelAndView.setViewName("index");    modelAndView.addObject("user", userInfo);    request.getSession().setAttribute("test","123");    return modelAndView;}}
  • 登錄過濾器
public class LoginFilter implements Filter {    public static final String USER_INFO = "user";    @Override    public void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest,                     ServletResponse servletResponse, FilterChain filterChain)        throws IOException, ServletException {    HttpServletRequest request = (HttpServletRequest) servletRequest;     HttpServletResponse response = (HttpServletResponse)servletResponse;    Object userInfo = request.getSession().getAttribute(USER_INFO);;    //如果未登陸,則拒絕請(qǐng)求,轉(zhuǎn)向登陸頁面    String requestUrl = request.getServletPath();    if (!"/toLogin".equals(requestUrl)//不是登陸頁面            && !requestUrl.startsWith("/login")//不是去登陸            && null == userInfo) {//不是登陸狀態(tài)        request.getRequestDispatcher("/toLogin").forward(request,response);        return ;    }    filterChain.doFilter(request,servletResponse);}@Overridepublic void destroy() {}}
  • 配置過濾器
@Configurationpublic class LoginConfig {//配置filter生效@Beanpublic FilterRegistrationBean sessionFilterRegistration() {    FilterRegistrationBean registration = new FilterRegistrationBean();    registration.setFilter(new LoginFilter());    registration.addUrlPatterns("/*");    registration.addInitParameter("paramName", "paramValue");    registration.setName("sessionFilter");    registration.setOrder(1);    return registration;}}
  • 登錄頁面
<!DOCTYPE HTML><html xmlns:th="http://www.thymeleaf.org"><head>    <title>enjoy login</title>    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /></head><body><div text-align="center">    <h1>請(qǐng)登陸</h1>    <form action="#" th:action="@{/login}" th:object="${user}" method="post">        <p>用戶名: <input type="text" th:field="*{username}" /></p>        <p>密  碼: <input type="text" th:field="*{password}" /></p>        <p><input type="submit" value="Submit" /> <input type="reset" value="Reset" /></p>        <input type="text" th:field="*{backurl}" hidden="hidden" />    </form></div></body></html>

3.2.2.2 web系統(tǒng)demo核心代碼5U228資訊網(wǎng)——每日最新資訊28at.com

  • 過濾器
public class SSOFilter implements Filter {    private RedisTemplate redisTemplate;public static final String USER_INFO = "user";public SSOFilter(RedisTemplate redisTemplate){    this.redisTemplate = redisTemplate;}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest,                     ServletResponse servletResponse, FilterChain filterChain)        throws IOException, ServletException {    HttpServletRequest request = (HttpServletRequest) servletRequest;    HttpServletResponse response = (HttpServletResponse)servletResponse;    Object userInfo = request.getSession().getAttribute(USER_INFO);;    //如果未登陸,則拒絕請(qǐng)求,轉(zhuǎn)向登陸頁面    String requestUrl = request.getServletPath();    if (!"/toLogin".equals(requestUrl)//不是登陸頁面            && !requestUrl.startsWith("/login")//不是去登陸            && null == userInfo) {//不是登陸狀態(tài)        String ticket = request.getParameter("ticket");        //有票據(jù),則使用票據(jù)去嘗試拿取用戶信息        if (null != ticket){            userInfo = redisTemplate.opsForValue().get(ticket);        }        //無法得到用戶信息,則去登陸頁面        if (null == userInfo){            response.sendRedirect("http://127.0.0.1:8080/toLogin?url="+request.getRequestURL().toString());            return ;        }        /**         * 將用戶信息,加載進(jìn)session中         */        UserForm user = (UserForm) userInfo;        request.getSession().setAttribute(SSOFilter.USER_INFO,user);        redisTemplate.delete(ticket);    }    filterChain.doFilter(request,servletResponse);}@Overridepublic void destroy() {}}
  • 控制器
@Controllerpublic class IndexController {    @Autowired    private RedisTemplate redisTemplate;@GetMapping("/index")public ModelAndView index(HttpServletRequest request) {    ModelAndView modelAndView = new ModelAndView();    Object userInfo = request.getSession().getAttribute(SSOFilter.USER_INFO);    UserForm user = (UserForm) userInfo;    modelAndView.setViewName("index");    modelAndView.addObject("user", user);    request.getSession().setAttribute("test","123");    return modelAndView;}}
  • 首頁
<!DOCTYPE HTML><html xmlns:th="http://www.thymeleaf.org"><head>    <title>enjoy index</title>    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /></head><body><div th:object="${user}">    <h1>cas-website:歡迎你"></h1></div></body></html>

3.2.3 CAS的單點(diǎn)登錄和OAuth2的區(qū)別

OAuth2: 三方授權(quán)協(xié)議,允許用戶在不提供賬號(hào)密碼的情況下,通過信任的應(yīng)用進(jìn)行授權(quán),使其客戶端可以訪問權(quán)限范圍內(nèi)的資源。5U228資訊網(wǎng)——每日最新資訊28at.com

CAS: 中央認(rèn)證服務(wù)(Central Authentication Service),一個(gè)基于Kerberos票據(jù)方式實(shí)現(xiàn)SSO單點(diǎn)登錄的框架,為Web 應(yīng)用系統(tǒng)提供一種可靠的單點(diǎn)登錄解決方法(屬于 Web SSO )。5U228資訊網(wǎng)——每日最新資訊28at.com

  • CAS的單點(diǎn)登錄時(shí)保障客戶端的用戶資源的安全,OAuth2則是保障服務(wù)端的用戶資源的安全 。
  • CAS客戶端要獲取的最終信息是,這個(gè)用戶到底有沒有權(quán)限訪問我(CAS客戶端)的資源。OAuth2獲取的最終信息是,我(oauth2服務(wù)提供方)的用戶的資源到底能不能讓你(oauth2的客戶端)訪問。

因此,需要統(tǒng)一的賬號(hào)密碼進(jìn)行身份認(rèn)證,用CAS;需要授權(quán)第三方服務(wù)使用我方資源,使用OAuth2;5U228資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-112778-0.html告別繁瑣操作,實(shí)現(xiàn)一次登錄產(chǎn)品互通

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 定時(shí)任務(wù)數(shù)量爆炸?Netty教你如何應(yīng)對(duì)百萬級(jí)挑戰(zhàn)

下一篇: PHP異步非阻塞MySQL客戶端連接池

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 小米官宣:2023年上半年出貨量中國(guó)第一!

    今日早間,小米電視官方微博帶來消息,稱2023年小米電視上半年出貨量達(dá)到了中國(guó)第一,同時(shí)還表示小米電視的巨屏風(fēng)暴即將開始。“公布一個(gè)好消息2023年#小米電視上半年出貨量中國(guó)
  • 女孩租房開2小時(shí)空調(diào)用完100元電費(fèi)引熱議:5級(jí)能耗惹不起 月薪過萬電費(fèi)也交不起

    近日,江蘇蘇州一女孩租房當(dāng)天充值了100元電費(fèi),開著空調(diào)不到2小時(shí)發(fā)現(xiàn)電費(fèi)已用完。對(duì)于為什么這個(gè)快,房東表示,電表壞了這種情況很多,之前也遇到過,給租客換
  • 這款新興工具平臺(tái),讓你的電腦效率翻倍

    隨著信息技術(shù)的發(fā)展,我們獲取信息的渠道越來越多,但是處理信息的效率卻成為一個(gè)瓶頸。于是各種工具應(yīng)運(yùn)而生,都在爭(zhēng)相解決我們的工作效率問題。今天我要給大家介紹一款效率
  • 雅柏威士忌多款單品價(jià)格大跌,泥煤頂流也不香了?

    來源 | 烈酒商業(yè)觀察編 | 肖海林今年以來,威士忌市場(chǎng)開始出現(xiàn)了降溫跡象,越來越多不斷暴漲的網(wǎng)紅威士忌也開始悄然回歸市場(chǎng)理性。近日,LVMH集團(tuán)旗下蘇格蘭威士忌品牌雅柏(Ardbeg
  • 重估百度丨“晚熟”的百度云,能等到春天嗎?

    &copy;自象限原創(chuàng)作者|程心排版|王喻可2016年7月13日,百度云計(jì)算戰(zhàn)略發(fā)布會(huì)在北京舉行,宣告著百度智能云的正式啟程。彼時(shí)的會(huì)場(chǎng)座無虛席,甚至排隊(duì)排到了門外,在場(chǎng)的所有人幾乎都
  • 自律,給不了Keep自由!

    來源 | 互聯(lián)網(wǎng)品牌官作者 | 李大為編排 | 又耳 審核 | 谷曉輝自律能不能給用戶自由暫時(shí)不好說,但大概率不能給Keep自由。近日,全球最大的在線健身平臺(tái)Keep正式登陸港交所,努力
  • 猿輔導(dǎo)與新東方的兩種“歸途”

    作者|卓心月 出品|零態(tài)LT(ID:LingTai_LT)如何成為一家偉大企業(yè)?答案一定是對(duì)&ldquo;勢(shì)&rdquo;的把握,這其中最關(guān)鍵的當(dāng)屬對(duì)企業(yè)戰(zhàn)略的制定,且能夠站在未來看現(xiàn)在,即使這其中的
  • 蘋果140W USB-C充電器:采用氮化鎵技術(shù)

    據(jù)10 月 30 日 9to5 Mac 消息報(bào)道,當(dāng)蘋果推出新的 MacBook Pro 2021 時(shí),該公司還推出了新的 140W USB-C 充電器,附贈(zèng)在 MacBook Pro 16 英寸機(jī)型的盒子里,也支
  • 聯(lián)想的ThinkBook Plus下一版曝光,鍵盤旁邊塞個(gè)平板

    ThinkBook Plus 是聯(lián)想的一個(gè)特殊筆記本類別,它在封面放入了一塊墨水屏,也給人留下了較為深刻的印象。據(jù)有人爆料,聯(lián)想的下一款 ThinkBook Plus 可能更特殊,它
Top 主站蜘蛛池模板: 临武县| 嘉兴市| 如东县| 沂南县| 吕梁市| 临汾市| 即墨市| 绥滨县| 阿合奇县| 徐闻县| 广宗县| 云林县| 来安县| 芮城县| 江门市| 临桂县| 台南市| 大名县| 延吉市| 若尔盖县| 柘荣县| 新泰市| 乐陵市| 密云县| 红桥区| 海南省| 临高县| 蛟河市| 集安市| 海原县| 佛学| 和田县| 镇江市| 兴安盟| 简阳市| 宁安市| 淮南市| 道孚县| 富锦市| 呼玛县| 宜丰县|