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. }