0
点赞
收藏
分享

微信扫一扫

SSO单点登录_03


SSO:单点登录.一般是系统之间整合需要解决的一个问题.例如你之前做了个BBS或者一个CMS的系统.你在完成一个全新系统时候需要用到BBS这个系统的话..你就可能面临一个整合的问题.(除非你自己决定从新做个BBS上去) 对于我们已有的WEB应用中的用户,若该用户已经登陆,并通过 联结迁移到BBS页面时,BBS要能够识别该用户已经登陆(不需要二次登陆)才不会让用户感到别扭(对用户来说,就好像使用的是同一个系统似的)。

下面看下Jforum对于SSO的处理.
首先找到SSO处理所有类:net.jforum.sso下的SSO(需要实现的接口) SSOUtils(工具类)类;net.jforum.ControllerUtils;net.jforum.JForum
首先从xml中可以看到net.jforum.JForum这是整个系统一个核心的servlet.所以所有访问将通过该实体类
1.当一个用户访问JForum时.刷新session





ControllerUtils utils = new ControllerUtils();
// 刷新session
utils.refreshSession();

2.进入ControllerUtils的refreshSession()



1. public void
2.     {   
3. //获取系统用户session 
4. //获取封装后的request值 
5.   
6. if (userSession == null) {//如果userSession不存在话 
7. new
8. //初始化基础信息 
9.             userSession.setSessionId(request.getSessionContext().getId());   
10.             userSession.setIp(request.getRemoteAddr());   
11. //清除登录session的值 
12.   
13. if (!JForumExecutionContext.getForumContext().isBot()) {//如果不是机器登录 
14. // Non-SSO authentications can use auto login 
15. /** 
16.                  * 要启用sso功能话需要配置SystemGlobals.properties的中 
17.                  * authentication.type的值=ConfigKeys.TYPE_SSO 
18.                  */
19. if
20. if
21. this.checkAutoLogin(userSession);    
22.                     }   
23. else
24.                         userSession.makeAnonymous();   
25.                     }   
26.                 }   
27. else
28. this.checkSSO(userSession);//检测sso 
29.                 }   
30.             }   
31.   
32. //将userSession设置到SessionFacade 
33.         }   
34. else if (ConfigKeys.TYPE_SSO.equals(SystemGlobals.getValue(ConfigKeys.AUTHENTICATION_TYPE))) {//是否启用sso 
35.             SSO sso;   
36.                
37. try
38. /** 
39.                  * ConfigKeys.SSO_IMPLEMENTATION  
40.                  * 取决你用什么方式实现SSO 可以是Cookies形式或者JDAP等形式而相应完成的实现类需要在SystemGlobals.properties配置 sso.implementation = 实现类完整路径 
41.                  */
42.                 sso = (SSO) Class.forName(SystemGlobals.getValue(ConfigKeys.SSO_IMPLEMENTATION)).newInstance();   
43.             }   
44. catch
45. throw new
46.             }   
47.   
48. // If SSO, then check if the session is valid 
49. if (!sso.isSessionValid(userSession, request)) {//session值是否通过SSO验证. 
50.                 SessionFacade.remove(userSession.getSessionId());   
51.                 refreshSession();   
52.             }   
53.         }   
54. else
55.             SessionFacade.getUserSession().updateSessionTime();   
56.         }   
57.     }


从代码中可以看出.checkSSO这个方法将是重点:




1. protected void
2.     {   
3. try
4. /** 
5.              * ConfigKeys.SSO_IMPLEMENTATION  
6.              * 中对应SystemGlobals.properties配置中SSO的实现类 
7.              * 取决你用什么方式实现SSO  
8.              * 可以是Cookies形式或者JDAP等形式 sso.implementation = 实现类完整路径 
9.              */
10.             SSO sso = (SSO) Class.forName(SystemGlobals.getValue(ConfigKeys.SSO_IMPLEMENTATION)).newInstance();   
11. /** 
12.              * sso检测用户.返回为用户的值 
13.              */
14.             String username = sso.authenticateUser(JForumExecutionContext.getRequest());   
15. /** 
16.              * 若返回了一个null,则设置为“Anonymous” (设置匿名用户) 
17.              * checkAutoLogin()将调用makeAnonymous()里面设置的匿名cookies值 
18.              * 若一个“Anonymous”用户试图访问权限以外的页面, 
19.              * JForum将根据SSO的设置导航到登陆页面, 
20.              * 同时传递给一个登陆成功后应该迁移到的地址参数给login页面。 
21.              */
22. if (username == null || username.trim().equals("")) {    
23.                 userSession.makeAnonymous();   
24.             }   
25. /** 
26.              *  若返回了一个不为空的username时, 
27.              * JForum将会检查是否匹配JForum数据库的userid。 
28.              *  若没有匹配的userid,JForum将动态加以创建 
29.              *  
30.              */
31. else
32. new
33.   
34. if (!utils.userExists(username)) {//如果用户不存在进行添加 
35.                     SessionContext session = JForumExecutionContext.getRequest().getSessionContext();   
36.   
37.                     String email = (String) session.getAttribute(SystemGlobals.getValue(ConfigKeys.SSO_EMAIL_ATTRIBUTE));   
38.                     String password = (String) session.getAttribute(SystemGlobals.getValue(ConfigKeys.SSO_PASSWORD_ATTRIBUTE));   
39.   
40. if (email == null) {    
41.                         email = SystemGlobals.getValue(ConfigKeys.SSO_DEFAULT_EMAIL);   
42.                     }   
43.   
44. if (password == null) {    
45.                         password = SystemGlobals.getValue(ConfigKeys.SSO_DEFAULT_PASSWORD);   
46.                     }   
47.   
48. //JForum设置该user为登陆状态  
49.                 }   
50.   
51. this.configureUserSession(userSession, utils.getUser());    
52.             }   
53.         }   
54. catch
55.             e.printStackTrace();   
56. throw new ForumException("Error while executing SSO actions: "
57.         }   
58.     }

举报

相关推荐

0 条评论