¸üÐÂʱ¼ä:2019Äê01ÔÂ10ÈÕ14ʱ54·Ö À´Ô´:ÀÖÓã²¥¿Í ä¯ÀÀ´ÎÊý:
¡¡¡¡Ê²Ã´Êǵ¥µãµÇ¼£º
¡¡¡¡Single Sign On£¬¼ò³ÆÎª SSO£¬ÊÇĿǰ±È½ÏÁ÷ÐÐµÄÆóÒµÒµÎñÕûºÏµÄ½â¾ö·½°¸Ö®Ò»¡£SSOµÄ¶¨ÒåÊÇÔÚ¶à¸öÓ¦ÓÃϵͳÖУ¬Óû§Ö»ÐèÒªµÇ¼һ´Î¾Í¿ÉÒÔ·ÃÎÊËùÓÐÏ໥ÐÅÈεÄÓ¦ÓÃϵͳ¡£
¡¡¡¡1 µ¥µãµÇ¼µÄÁ÷³Ì
¡¡¡¡Óû§·ÃÎÊϵͳ1µÄÊܱ£»¤×ÊÔ´£¬ÏµÍ³1·¢ÏÖÓû§Î´µÇ¼£¬Ìø×ªÖÁssoÈÏÖ¤ÖÐÐÄ£¬²¢½«×Ô¼ºµÄµØÖ·×÷Ϊ²ÎÊý
¡¡¡¡ssoÈÏÖ¤ÖÐÐÄ·¢ÏÖÓû§Î´µÇ¼£¬½«Óû§Òýµ¼ÖÁµÇÂ¼Ò³Ãæ
¡¡¡¡Óû§ÊäÈëÓû§ÃûÃÜÂëÌá½»µÇ¼ÉêÇë
¡¡¡¡ssoÈÏÖ¤ÖÐÐÄУÑéÓû§ÐÅÏ¢£¬´´½¨Óû§ÓëssoÈÏÖ¤ÖÐÐÄÖ®¼äµÄ»á»°£¬³ÆÎªÈ«¾Ö»á»°£¬Í¬Ê±´´½¨ÊÚȨÁîÅÆ
¡¡¡¡ssoÈÏÖ¤ÖÐÐÄ´ø×ÅÁîÅÆÌø×ª»á×î³õµÄÇëÇóµØÖ·(ϵͳ1)
¡¡¡¡ÏµÍ³1Äõ½ÁîÅÆ£¬È¥ssoÈÏÖ¤ÖÐÐÄУÑéÁîÅÆÊÇ·ñÓÐЧ
¡¡¡¡ssoÈÏÖ¤ÖÐÐÄУÑéÁîÅÆ£¬·µ»ØÓÐЧ£¬×¢²áϵͳ1
¡¡¡¡ÏµÍ³1ʹÓøÃÁîÅÆ´´½¨ÓëÓû§µÄ»á»°£¬³ÆÎª¾Ö²¿»á»°£¬·µ»ØÊܱ£»¤×ÊÔ´
¡¡¡¡Óû§·ÃÎÊϵͳ2µÄÊܱ£»¤×ÊÔ´
¡¡¡¡ÏµÍ³2·¢ÏÖÓû§Î´µÇ¼£¬Ìø×ªÖÁssoÈÏÖ¤ÖÐÐÄ£¬²¢½«×Ô¼ºµÄµØÖ·×÷Ϊ²ÎÊý
¡¡¡¡ssoÈÏÖ¤ÖÐÐÄ·¢ÏÖÓû§ÒѵǼ£¬Ìø×ª»ØÏµÍ³2µÄµØÖ·£¬²¢¸½ÉÏÁîÅÆ
¡¡¡¡ÏµÍ³2Äõ½ÁîÅÆ£¬È¥ssoÈÏÖ¤ÖÐÐÄУÑéÁîÅÆÊÇ·ñÓÐЧ
¡¡¡¡ssoÈÏÖ¤ÖÐÐÄУÑéÁîÅÆ£¬·µ»ØÓÐЧ£¬×¢²áϵͳ2
¡¡¡¡ÏµÍ³2ʹÓøÃÁîÅÆ´´½¨ÓëÓû§µÄ¾Ö²¿»á»°£¬·µ»ØÊܱ£»¤×ÊÔ´
¡¡¡¡Óû§µÇ¼³É¹¦Ö®ºó£¬»áÓëssoÈÏÖ¤ÖÐÐļ°¸÷¸ö×Óϵͳ½¨Á¢»á»°£¬
¡¡¡¡Óû§ÓëssoÈÏÖ¤ÖÐÐĽ¨Á¢µÄ»á»°³ÆÎªÈ«¾Ö»á»°£¬Óû§Óë¸÷¸ö×Óϵͳ½¨Á¢µÄ»á»°³ÆÎª¾Ö²¿»á»°£¬
¡¡¡¡¾Ö²¿»á»°½¨Á¢Ö®ºó£¬Óû§·ÃÎÊ×ÓϵͳÊܱ£»¤×ÊÔ´½«²»ÔÙͨ¹ýssoÈÏÖ¤ÖÐÐÄ£¬
¡¡¡¡È«¾Ö»á»°Óë¾Ö²¿»á»°ÓÐÈçÏÂÔ¼Êø¹ØÏµ¡£
¡¡¡¡¾Ö²¿»á»°´æÔÚ£¬È«¾Ö»á»°Ò»¶¨´æÔÚ¡£
¡¡¡¡È«¾Ö»á»°´æÔÚ£¬¾Ö²¿»á»°²»Ò»¶¨´æÔÚ¡£
¡¡¡¡È«¾Ö»á»°Ïú»Ù£¬¾Ö²¿»á»°±ØÐëÏú»Ù¡£
¡¡¡¡2 µ¥µã×¢Ïú£º
¡¡¡¡Óû§Ïòϵͳ1·¢Æð×¢ÏúÇëÇó
¡¡¡¡ÏµÍ³1¸ù¾ÝÓû§Óëϵͳ1½¨Á¢µÄ»á»°idÄõ½ÁîÅÆ£¬ÏòssoÈÏÖ¤ÖÐÐÄ·¢Æð×¢ÏúÇëÇó
¡¡¡¡ssoÈÏÖ¤ÖÐÐÄУÑéÁîÅÆÓÐЧ£¬Ïú»ÙÈ«¾Ö»á»°£¬Í¬Ê±È¡³öËùÓÐÓôËÁîůע²áµÄϵͳµØÖ·
¡¡¡¡ssoÈÏÖ¤ÖÐÐÄÏòËùÓÐ×¢²áϵͳ·¢Æð×¢ÏúÇëÇó
¡¡¡¡¸÷×¢²áϵͳ½ÓÊÕssoÈÏÖ¤ÖÐÐĵÄ×¢ÏúÇëÇó£¬Ïú»Ù¾Ö²¿»á»°
¡¡¡¡ssoÈÏÖ¤ÖÐÐÄÒýµ¼Óû§ÖÁµÇÂ¼Ò³Ãæ£¬×¢Ïú³É¹¦
¡¡¡¡3 µ¥µãµÇ¼µÄʵÏÖ£º
¡¡¡¡sso²ÉÓÿͻ§¶Ë/·þÎñ¶Ë¼Ü¹¹£¬ÎÒÃÇÏÈ¿´sso-clientÓësso-serverҪʵÏֵŦÄÜ(ÏÂÃæ£ºssoÈÏÖ¤ÖÐÐÄ=sso-server)
¡¡¡¡1 sso-client£º
¡¡¡¡À¹½Ø×ÓϵͳδµÇ¼Óû§ÇëÇó£¬Ìø×ªÖÁssoÈÏÖ¤ÖÐÐÄ
¡¡¡¡½ÓÊÕ²¢´æ´¢ssoÈÏÖ¤ÖÐÐÄ·¢Ë͵ÄÁîÅÆ
¡¡¡¡Óësso-serverͨÐÅ£¬Ð£ÑéÁîÅÆµÄÓÐЧÐÔ
¡¡¡¡½¨Á¢¾Ö²¿»á»°
¡¡¡¡À¹½ØÓû§×¢ÏúÇëÇó£¬ÏòssoÈÏÖ¤ÖÐÐÄ·¢ËÍ×¢ÏúÇëÇó
¡¡¡¡½ÓÊÕssoÈÏÖ¤ÖÐÐÄ·¢³öµÄ×¢ÏúÇëÇó£¬Ïú»Ù¾Ö²¿»á»°
¡¡¡¡2 sso-server£º
¡¡¡¡ÑéÖ¤Óû§µÄµÇ¼ÐÅÏ¢
¡¡¡¡´´½¨È«¾Ö»á»°
¡¡¡¡´´½¨ÊÚȨÁîÅÆ
¡¡¡¡Óësso-clientͨÐÅ·¢ËÍÁîÅÆ
¡¡¡¡Ð£Ñésso-clientÁîÅÆÓÐЧÐÔ
¡¡¡¡ÏµÍ³×¢²á
¡¡¡¡½ÓÊÕsso-client×¢ÏúÇëÇó£¬×¢ÏúËùÓлỰ
¡¡¡¡1 ÔÚ×ÓϵͳÖÐʹÓÃfilterÀ¹½ØÇëÇó£¬ÔÚsso-clientÖÐн¨LoginFilter.javaÀಢʵÏÖFilter½Ó¿Ú£¬ÔÚdoFilter()·½·¨ÖмÓÈë¶ÔδµÇ¼Óû§µÄÀ¹½Ø
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
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")) { 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"); } chain.doFilter(request, response); return; } //Ìø×ªÖÁssoÈÏÖ¤ÖÐÐÄ res.sendRedirect("sso-server-url-with-system-url"); } |
¡¡¡¡À¹½Ø´Ósso-clientÌø×ªÖÁssoÈÏÖ¤ÖÐÐĵÄδµÇ¼ÇëÇó£¬Ìø×ªÖÁµÇÂ¼Ò³Ãæ£¬Õâ¸ö¹ý³ÌÓësso-clientÍêȫһÑù
¡¡¡¡3¡¢sso-serverÑéÖ¤Óû§µÇ¼ÐÅÏ¢
¡¡¡¡Óû§ÔÚµÇÂ¼Ò³ÃæÊäÈëÓû§ÃûÃÜÂ룬ÇëÇóµÇ¼£¬ssoÈÏÖ¤ÖÐÐÄУÑéÓû§ÐÅÏ¢£¬Ð£Ñé³É¹¦£¬½«»á»°×´Ì¬±ê¼ÇΪ“ÒѵǼ”
|
1
2
3
4
5
6
|
@RequestMapping("/login") public String login(String username, String password, HttpServletRequest req) { this.checkLoginInfo(username, password); req.getSession().setAttribute("isLogin", true); return "success"; } |
¡¡¡¡4¡¢sso-server´´½¨ÊÚȨÁîÅÆ
¡¡¡¡ÊÚȨÁîÅÆÊÇÒ»´®Ëæ»ú×Ö·û£¬ÒÔʲôÑùµÄ·½Ê½Éú³É¶¼Ã»ÓйØÏµ£¬Ö»Òª²»Öظ´¡¢²»Ò×αÔì¼´¿É£¬ÏÂÃæÊÇÒ»¸öÀý×Ó£º
|
1
|
String token = UUID.randomUUID().toString(); |
¡¡¡¡5¡¢sso-clientÈ¡µÃÁîÅÆ²¢Ð£Ñé
¡¡¡¡ssoÈÏÖ¤ÖÐÐĵǼºó£¬Ìø×ª»Ø×Óϵͳ²¢¸½ÉÏÁîÅÆ£¬×Óϵͳ(sso-client)È¡µÃÁîÅÆ£¬È»ºóÈ¥ssoÈÏÖ¤ÖÐÐÄУÑ飬ÔÚLoginFilter.javaµÄdoFilter()ÖÐÌí¼Ó¼¸ÐÐ
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
// ÇëÇ󸽴ø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); |
¡¡¡¡6¡¢sso-server½ÓÊÕ²¢´¦ÀíУÑéÁîÅÆÇëÇó
¡¡¡¡Óû§ÔÚssoÈÏÖ¤ÖÐÐĵǼ³É¹¦ºó£¬sso-server´´½¨ÊÚȨÁîÅÆ²¢´æ´¢¸ÃÁîÅÆ£¬ËùÒÔ£¬sso-server¶ÔÁîÅÆµÄУÑé¾ÍÊÇÈ¥²éÕÒÕâ¸öÁîÅÆÊÇ·ñ´æÔÚÒÔ¼°ÊÇ·ñ¹ýÆÚ£¬ÁîÅÆÐ£Ñé³É¹¦ºósso-server½«·¢ËÍУÑéÇëÇóµÄϵͳע²áµ½ssoÈÏÖ¤ÖÐÐÄ(¾ÍÊÇ´æ´¢ÆðÀ´µÄÒâ˼)
¡¡¡¡ÁîÅÆÓë×¢²áϵͳµØÖ·Í¨³£´æ´¢ÔÚkey-valueÊý¾Ý¿â(Èçredis)ÖУ¬redis¿ÉÒÔΪkeyÉèÖÃÓÐЧʱ¼äÒ²¾ÍÊÇÁîÅÆµÄÓÐЧÆÚ¡£redisÔËÐÐÔÚÄÚ´æÖУ¬Ëٶȷdz£¿ì£¬ÕýºÃsso-server²»ÐèÒª³Ö¾Ã»¯ÈκÎÊý¾Ý¡£
¡¡¡¡ÁîÅÆÓë×¢²áϵͳµØÖ·¿ÉÒÔÓÃÏÂͼÃèÊöµÄ½á¹¹´æ´¢ÔÚredisÖУ¬¿ÉÄÜÄã»áÎÊ£¬ÎªÊ²Ã´Òª´æ´¢ÕâЩϵͳµÄµØÖ·?Èç¹û²»´æ´¢£¬×¢ÏúµÄʱºò¾ÍÂé·³ÁË£¬Óû§ÏòssoÈÏÖ¤ÖÐÐÄÌá½»×¢ÏúÇëÇó£¬ssoÈÏÖ¤ÖÐÐÄ×¢ÏúÈ«¾Ö»á»°£¬µ«²»ÖªµÀÄÄЩϵͳÓôËÈ«¾Ö»á»°½¨Á¢ÁË×Ô¼ºµÄ¾Ö²¿»á»°£¬Ò²²»ÖªµÀÒªÏòÄÄЩ×Óϵͳ·¢ËÍ×¢ÏúÇëÇó×¢Ïú¾Ö²¿»á»°
¡¡¡¡3b221593-f9c4-45af-a567-4937786993e8
¡¡¡¡7¡¢sso-clientУÑéÁîÅÆ³É¹¦´´½¨¾Ö²¿»á»°
¡¡¡¡ÁîÅÆÐ£Ñé³É¹¦ºó£¬sso-client½«µ±Ç°¾Ö²¿»á»°±ê¼ÇΪ“ÒѵǼ”£¬ÐÞ¸ÄLoginFilter.java£¬Ìí¼Ó¼¸ÐÐ
if (verifyResult) {¡¡¡¡8¡¢×¢Ïú¹ý³Ì
¡¡¡¡Óû§Ïò×Óϵͳ·¢ËÍ´øÓГlogout”²ÎÊýµÄÇëÇó(×¢ÏúÇëÇó)£¬sso-clientÀ¹½ØÆ÷À¹½Ø¸ÃÇëÇó£¬ÏòssoÈÏÖ¤ÖÐÐÄ·¢Æð×¢ÏúÇëÇó
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
|
String logout = req.getParameter("logout");if (logout != null) { this.ssoServer.logout(token);}//ssoÈÏÖ¤ÖÐÐÄÒ²ÓÃͬÑùµÄ·½Ê½Ê¶±ð³össo-clientµÄÇëÇóÊÇ×¢ÏúÇëÇ󣨴øÓГlogout”²ÎÊý£©£¬ssoÈÏÖ¤ÖÐÐÄ×¢ÏúÈ«¾Ö»á»°@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) {}} |
×÷ÕߣºÀÖÓã²¥¿ÍJavaEEÅàѵѧԺ
Ê×·¢£ºhttp://java.itcast.cn
±±¾©Ð£Çø