Jforum 单点登录.doc_第1页
Jforum 单点登录.doc_第2页
Jforum 单点登录.doc_第3页
Jforum 单点登录.doc_第4页
Jforum 单点登录.doc_第5页
免费预览已结束,剩余28页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JForum預設cookie-based的sso.implementation是net.jforum.sso.CookieUserSSO,但是原始碼並沒有這個CookieUserSSO類別,所以如果我們照著文件做會失敗。在此附上一份經過實際測試沒有問題的CookieUserSSO.java及CookieUserSSO.class檔,如果您的需求是很單純的用Cookie來作Single Sign-On,則下載後重新編譯,將編譯後的class檔放到WEB-INF/classes/net/jforum/sso目錄下,然後重新載入JForum即可。01.packagenet.jforum.sso;02.03.importjavax.servlet.http.Cookie;04.importnet.jforum.context.RequestContext;05.importnet.jforum.JForumExecutionContext;06.importnet.jforum.ControllerUtils;07.importnet.jforum.entities.UserSession;08.importnet.jforum.util.preferences.ConfigKeys;09.importnet.jforum.util.preferences.SystemGlobals;10.importorg.apache.log4j.Logger;11.12.publicclassCookieUserSSOimplementsSSO 13.14.staticfinalLogger logger = Logger.getLogger(CookieUserSSO.class.getName();15.16.publicString authenticateUser(RequestContext request) 17./ myapp login cookie, contain logged username18.Cookie myCookie = ControllerUtils.getCookie(19.SystemGlobals.getValue(ConfigKeys.COOKIE_NAME_USER);20.String username =null;21.22.if(myCookie !=null) 23.username = myCookie.getValue();24.25.returnusername;/ jforum username26.27.28.publicbooleanisSessionValid(UserSession userSession, RequestContext request) 29.Cookie SSOCookie = ControllerUtils.getCookie(30.SystemGlobals.getValue(ConfigKeys.COOKIE_NAME_USER);/ myapp login cookie31.String remoteUser =null;32.33.if(SSOCookie !=null) 34.remoteUser = SSOCookie.getValue();/ jforum username35.36.37./ user has since logged out38.if(remoteUser =null&39.userSession.getUserId() != SystemGlobals.getIntValue(ConfigKeys.ANONYMOUS_USER_ID) 40.returnfalse;41./ user has since logged in42.elseif(remoteUser !=null&43.userSession.getUserId() = SystemGlobals.getIntValue(ConfigKeys.ANONYMOUS_USER_ID) 44.returnfalse;45./ user has changed user46.elseif(remoteUser !=null& !remoteUser.equals(userSession.getUsername() 47.returnfalse;48.49.returntrue;/ myapp user and forum user the same50.51.另外,還要設定一下jforum-custom.conf,設定範例如下:authentication.type=ssosso.implementation=net.jforum.sso.CookieUserSSOsso.redirect=/.user=username紅色字體部分即是您需要依您實際狀況修改的地方,例如上面的例子意思是您的會員登入是在控管,而login.jsp在驗證完畢後,會寫入一個username的cookie(domain需是),並讀出returnUrl參數來導回到原來的網址去。Jforum 单点登录实现你自己的登陆类(SSO)你的类必须实现JF的接口: net.forum.sso.SSO .注意:使用你自定义的接口类后,关于用户注册/用户激活等功能将不再使用了,而你要通过你的来进入注册.(配置注册地址下面有提示)接口类:以下是从JF.net上Copy过来的一个例子,借供参考.也可以参考本站例子:/svn/fileDownload.jsp?url=trunk%2Ftrydone_src%2Fcom%2Ftrydone%2Fforum%2Fsso%2FSimpleSSOImpl.java&attachment=true源码打印1. /注意:例子已经过时,仅供参考,其中大部分类都是用户自定义的,非jforum2. packagenet.jforum.sso;3. 4. importjavax.servlet.http.HttpServletRequest;5. importjavax.servlet.http.HttpSession;6. importjavax.servlet.http.Cookie;7. 8. importnet.jforum.ActionServletRequest;9. importnet.jforum.ControllerUtils;10. importnet.jforum.entities.UserSession;11. importnet.jforum.util.preferences.ConfigKeys;12. importnet.jforum.util.preferences.SystemGlobals;13. importnet.jforum.JForum;14. 15. /导入你所要的类16. 17. importorg.apache.log4j.Logger;/这里用log4j做日志处理18. 19. publicclassMyUserSSOimplementsSSO/必须实现接口net.jforum.sso.SSO20. 21. staticfinalLoggerlogger=Logger.getLogger(MyUserSSO.class.getName();/初始化日志接口22. 23. publicStringauthenticateUser(ActionServletRequestrequest)/实现接口方法(必须)24. UserVOuser=newUserVO();25. CookiemyCookie=ControllerUtils.getCookie(auto-login);/cookie26. 27. if(myCookie!=null)28. DAOManagermanager=newJndiDAOManager();/这里连接你的数据库进行用户验证29. UserDAOuserDAO=manager.getUserDAO(manager.getConnection();30. user=userDAO.getUser(HexTool.hexToString(myCookie.getValue();31. manager.close();32. else33. returnnull;/没有cookie34. 35. 36. if(user.isDisabled()37. logger.warn(*DISABLED_ATTEMPTonForum:+user.getUsername();/logdisabledattempt.38. returnnull;39. 40. 41. HttpSessionsession=JForum.getRequest().getSession();42. session.setAttribute(password,user.getPassword();/设置password43. session.setAttribute(email,user.getUsername();/邮箱(也是用户名?)44. 45. ControllerUtils.addCookie(JforumSSO,user.getScreenName(),myCookie.getMaxAge();/refresh46. 47. returnuser.getScreenName();/返回JForum的用户48. 49. 50. publicbooleanisSessionValid(UserSessionuserSession,HttpServletRequestrequest)51. StringremoteUser=null;52. CookieSSOCookie=ControllerUtils.getCookie(JforumSSO);53. if(SSOCookie!=null)remoteUser=SSOCookie.getValue();/jforum用户名54. 55. /用户已经退出56. if(remoteUser=null&57. userSession.getUserId()!=SystemGlobals.getIntValue(ConfigKeys.ANONYMOUS_USER_ID)58. returnfalse;59. 60. /用户已经登陆61. 62. elseif(remoteUser!=null&63. userSession.getUserId()=SystemGlobals.getIntValue(ConfigKeys.ANONYMOUS_USER_ID)64. returnfalse;65. 66. /userhaschangeduser67. elseif(remoteUser!=null&!remoteUser.equals(userSession.getUsername()68. returnfalse;69. 70. returntrue;/myappuserandforumuserthesame71. 72. 修改 SystemGperties 配置,使用你自定义的用户登陆类:源码打印1. authentication.type=sso2. sso.implementation=net.jforum.sso.MyUserSSO/你的类3. sso.redirect=/login.jsp/这里是你注册时用的URL地址.现在你可以编译一下你的类,重启服务器,就这么简单.有关其它事项:after registration confirmation myapp sends the user to a welcome post on the forum. This creates the forum account automatically with correct date/time and also makes the user immediatelly availble for receiving Private Messages.if you provide a simple method for getting the Jforum users userid from the jforum database, you can present the correct my profile and my bookmarks urls in your main-site menus (the others will work already.JForum单点登陆原理与配置关键字: jforum二次开发在最近做项目的时候需要论坛系统,经过调研,最后确定使用jforum来作做二次开发!JForum是一个功能强大的开放源代码的BBS论坛。本文介绍 JForum与已有的web应用的整合,以及JForum单点登陆原理与配置。JForum可以单独作为一个BBS论坛运行,但是很多情况,我们需要在我们已有的WEB应用中集成JForum。JForum的与已有WEB应用的集成有很多种方法。本文介绍JForum官方推荐的通过自定义SSO类实现来完成JForum与已有WEB应用的集成。目标:实现SSO (Single Sign On) :单点登陆。一般来说,两个不同系统的整合的难点部分,便是需要解决单点登陆问题。对于我们已有的WEB应用中的用户,若该用户已经登陆,并通过 联结迁移到JForum页面时,JForum要能够识别该用户已经登陆(不需要二次登陆)才不会让用户感到别扭(对用户来说,就好像使用的是同一个系统似的)。但由于分属于2个不同的系统,所以它们之间不能共用同一套Session,这就需要使用一种特殊的机制来实现它们之间的互相通信。好在,JForum为我们考虑到了这一点,它提供了灵活的SSO接口与配置机制,我们只需要简单地实现一个SSO类,同时在JForum的配置文件中加以配置即可。JForum SSO机制的原理- 当一个用户访问JForum时,JForum便会检查是否配置SSO,如果配置了SSO,JForum便会调用authenticateUser()方法。该方法简单地返回username或null。- 若返回了一个不为空的username时,JForum将会检查是否匹配JForum数据库的userid。- 若没有匹配的userid,JForum将动态加以创建- JForum设置该user为登陆状态- 若返回了一个null,则设置为“Anonymous”- 若一个“Anonymous”用户试图访问权限以外的页面,JForum将根据SSO的设置导航到登陆页面,同时传递给一个登陆成功后应该迁移到的地址参数给login页面。JForum SSO的实现上面,我们大致了解了一下JForum的SSO机制的原理。根据SSO机制的原理,我们已经知道该怎么实现SSO。1,需要实现一个SSO类,该类需要取得从另外一个系统登陆进来的用户信息。一种最简单的方法是使用Cookie来实现。让已有的WEB应用在用户登陆时写入Cookie信息,然后JForum的SSO实现类中将该Cookie取出即可。另外,还可以使用web-service,文件的写入等等方式来实现。反正一个最基本的原则是:用户登陆时写入用户信息,然后在JForum一方能取出相同信息即可。实现SSO类:CookieUserSSO.javaJava代码1. packagenet.jforum.sso;2. 3. importjavax.servlet.http.Cookie;4. importjavax.servlet.http.HttpServletRequest;5. 6. importnet.jforum.ActionServletRequest;7. importnet.jforum.ControllerUtils;8. importnet.jforum.entities.UserSession;9. importnet.jforum.util.preferences.ConfigKeys;10. importnet.jforum.util.preferences.SystemGlobals;11. 12. importorg.apache.log4j.Logger;13. 14. publicclassCookieUserSSOimplementsSSO15. staticfinalLoggerlogger=Logger.getLogger(CookieUserSSO.class.getName();16. 17. publicStringauthenticateUser(ActionServletRequestrequest)18. /logincookiesetbymywebLOGINapplication19. CookiecookieNameUser=ControllerUtils.getCookie(SystemGlobals20. .getValue(ConfigKeys.COOKIE_NAME_USER);21. Stringusername=null;22. 23. if(cookieNameUser!=null)24. username=cookieNameUser.getValue();25. 26. returnusername;/returnusernameforjforum27. /jforumwillusethisnametoregistdatabaseorsetinHttpSession28. 29. 30. publicbooleanisSessionValid(UserSessionuserSession,HttpServletRequestrequest)31. CookiecookieNameUser=ControllerUtils.getCookie(SystemGlobals32. .getValue(ConfigKeys.COOKIE_NAME_USER);/usercookie33. StringremoteUser=null;34. 35. if(cookieNameUser!=null)36. remoteUser=cookieNameUser.getValue();/jforumusername37. 38. 39. if(remoteUser=null40. &userSession.getUserId()!=SystemGlobals41. .getIntValue(ConfigKeys.ANONYMOUS_USER_ID)42. /userhassinceloggedout43. returnfalse;44. elseif(remoteUser!=null45. &userSession.getUserId()=SystemGlobals46. .getIntValue(ConfigKeys.ANONYMOUS_USER_ID)47. /anonymoususerhasloggedin48. returnfalse;49. elseif(remoteUser!=null50. &!remoteUser.equals(userSession.getUsername()51. /notthesameuser(cookieandsession)52. returnfalse;53. 54. returntrue;/myappuserandforumuserthesame.validuser.55. 56. JForum本身也提供了一个RemoteUserSSO.java实现,由于该实现的authenticateUser方法只是简单地返回request.getRemoteUser(),不能显示已登陆的用户名,另外我们也可以对放进cookies的信息进行一些加密。2,配置JForum。修改SystemGperties有些JForum版本为jforum-custom.conf文件。 查找“SSO”字样,找到“SSO / User authentication”配置部分,将其修改为以下内容:authentication.type = sso#.sso.implementation = net.jforum.sso.CookieUserSSO并根据实际情况,修改.user=“你应用添加的cookies名”3,修改你的web应用用户登陆/注销部分的代码逻辑部分:登陆部分加入以下内容:Java代码1. 2. publicvoiddoLogin()3. .4. Cookiecookie=newCookie(jforumSSOCookieNameUser,loginUser.getUsername();5. cookie.setMaxAge(-1);6. cookie.setPath(/);/设置目录为根路径使cookie共享7. response.addCookie(cookie);8. .9. 注销部分加以以下内容:Java代码1. 2. publicvoiddoLogout()3. .4. Cookiecookie=newCookie(jforumSSOCookieNameUser,);5. cookie.setMaxAge(0);/deletethecookie.6. cookie.setPath(/);/设置目录为根路径使cookie共享7. response.addCookie(cookie);8. .9. forumSSOCookieNameUser为.user的设置内容。设置了单点登陆后,jforum的注册及登陆都会交给你的应用去实现了,所以你还要修改一下jforum的模板,把注册及登陆的连接指向你应用的相应页面!JForum集成-用户重名的一种解决方案Posted on 2009-10-14 17:41寒武纪阅读(947)评论(1)编辑收藏所属分类:系统集成 JForum做为一个成熟的开源BBS论坛解决方案,提供了非常方便的SSO集成接口。它的主页上和网上都有许多介绍如何用SSO方式进行集成的办法。这里不罗列,google可以找到许多资料,主要描述一下如何解决用户名重名的一种方式。目前使用的JForum版本是2.1.8 简单地介绍一下采用的SSO方式。由于应用上需要一个BBS,找了JForum做为一个子系统,集成到现成的一个管理系统当中,管理系统本身有一套完全的身份权限认证方案,由于系统的安全要求不是特别严格,所以采了最直接和最省事的方式:Cookie写入。即在管理系统登录时,把用户信息写入Cookie,JForum从Cookie中读取用户信息进行登录。 为JForum项目添加一个SSO接口的扩展类CookieSSO,主要实现authenticateUser(RequestContext request)方法。方法大体如下:publicStringauthenticateUser(RequestContextrequest)StringuserId=null;Cookiec=ControllerUtils.getCookie(ehrbbsuserid);if(c!=null)userId=c.getValue();(单点登录BBS用户ID为:+userId);returnuserId; 就是从Cookie中读取在管理系统中放入的username。但是这里写的是:ehrbbsuserid,主要是这个变量名来区分传过来的内容的不同。 按照正常的方式就是从管理系统把一个用户的username传过来。然后在这里取出,return给调用方法进行验证。在实际项目中,问题就出在这里了!举例说有二个用户名字都叫:李四,那么当二个李四都同时登录时,JForum的验证方式就会出问题!它认不清到底是哪个李四,数据库查询时只按第一个来! 仔细看一下jforum的数据库表设计,jforum_user这个表没有display_user_name类似的字段,它就是把username做为显示在页面上的用户名,如果不做集成,把它单独做为一个BBS时,username既是登录的用户名,也是显示在页面上的用户名。主要原因我想大概就是老外的思维方式跟中国人的不太一样。中国人登录的时候用英文,显示的时候还有一个昵称或是中文名等。 所以把它集成的时候,用Cookie传送一个username给JForum时就

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论