zoukankan      html  css  js  c++  java
  • 开源论坛jforum的集成

    Jforum是一款开源的java类的论坛,小巧高效,运用了很多JSP新技术,支持hsqldboraclemysql postgresql数据库,完全遵从MVC设计模式。

    1.首先下载最新的版本(更多信息请参考项目主页: www.jforum.net

    2.创建数据库,它支持多种数据库,可以根据自己需求选定。

    3.将jforum.war复制到tomcat目录下,启动tomcat。

    4.打开浏览器,进入http://127.0.0.1:8080/jforum/install.jsp
    进行自动安装,按照提示进行填写。

    5.完成安装后先不进入论坛。修改一些配置文件以支持中文。(虽然上面安装过程也设置,主要针对中文乱码问题)

    (1)打开jforum/WEB-INF/config/SystemGlobals.properties
     
    default.container.encoding = ISO-8859-1,修改为:
      default.container.encoding = UTF-8

    (2)打开jforum/WEB-INF/config/jforum-custom.conf
     
    定位到database.connection.string一项,在末尾追加
      &useUnicode=true&characterEncoding=utf8 

    6.重新启动tomcat,进入http://127.0.0.1:8080/jforum/forums/list.page

      admin身份登录,可以到后台设置论坛了。

    7.论坛与自己已有项目的集成(根据自己需要,我这里是自己已有项目已有用户管理,不想多次登录,这里使用jforum提供的SSO技术)

    (1)修改.jforum源码,实现net.jforum.sso接口 

    public class CookieUserSSO implements SSO {
    static final Logger logger = Logger.getLogger(CookieUserSSO.class.getName());
    public String authenticateUser(RequestContext request) {
    // login cookie set by my web LOGIN application 
    Cookie cookieNameUser = ControllerUtils.getCookie(SystemGlobals
    .getValue(ConfigKeys.COOKIE_NAME_USER));
    String username = null;
    if (cookieNameUser != null) {
    username = cookieNameUser.getValue();
    }
    logger.info("cookie username="+username);
    System.out.println("cookie username="+username);
    return username; // return username for jforum
    // jforum will use this name to regist database or set in HttpSession 
    }
    public boolean isSessionValid(UserSession userSession,
    RequestContext request) {
    Cookie cookieNameUser = ControllerUtils.getCookie(SystemGlobals
    .getValue(ConfigKeys.COOKIE_NAME_USER)); // user cookie 
    String remoteUser = null;
    if (cookieNameUser != null) {
    remoteUser = cookieNameUser.getValue(); // jforum username 
    }
    if (remoteUser == null
    && userSession.getUserId() != SystemGlobals
    .getIntValue(ConfigKeys.ANONYMOUS_USER_ID)) {
    // user has since logged out 
    return false;
    } else if (remoteUser != null
    && userSession.getUserId() == SystemGlobals
    .getIntValue(ConfigKeys.ANONYMOUS_USER_ID)) {
    // anonymous user has logged in 
    return false;
    } else if (remoteUser != null
    && !remoteUser.equals(userSession.getUsername())) {
    // not the same user (cookie and session) 
    return false;
    }
    return true; // myapp user and forum user the same. valid user. 
    }
    } 


    将编译后的.class文件存放在jforumWEB-INFclasses etjforumsso下

    (2)修改SystemGlobals.properties中的配置: 
    修改SystemGlobals.properties文件中的一下属性的内容: 

    authentication.type = sso
    sso.implementation = net.jforum.sso.CookieUserSSO
    sso.redirect = http://www.123.com/login.jsp //可根据实际的登录页面地址进行修改 
    cookie.name.user = 123UserInfo //自己项目中保存的cookie名称,可根据实际情况修改 

    (3)修改web应用中的登录和注销部分的逻辑: 

    登录部分加入以下代码:
    ...
    Cookie cookie = new Cookie("springTourUserInfo", sname);
    cookie.setMaxAge(-1);
    cookie.setPath("/");//cookie只在同一应用服务器有效 
    response.addCookie(cookie);
    ...
    注销部分加入以下代码:
    ......
    Cookie cookie = new Cookie("springTourUserInfo", "");
    cookie.setMaxAge(0); // delete the cookie. 
    cookie.setPath("/");
    response.addCookie(cookie);
    ...... 

    (4)在自己项目中增加论坛的链接: 
    <a href="/forum">论坛</a> 

    这样就ok了就可以使用了


    相关知识,一并附上

    实现SSO的技术主要有:
    (1)基于cookies实现,需要注意如下几点:如果是基于两个域名之间传递sessionid的方法可能
    在windows中成立,在unix&linux中可能会出现问题;可以基于数据库实现;在安全性方面可能会
    作更多的考虑。另外,关于跨域问题,虽然cookies本身不跨域,但可以利用它实现跨域的SSO。
    (2)Broker-based(基于经纪人),例如Kerberos等;
    这种技术的特点就是,有一个集中的认证和用户帐号管理的服务器。经纪人给被用于进一步请求
    的电子的身份存取。中央数据库的使用减少了管理的代价,并为认证提供一个公共和独立的"第三方"。
    例如Kerberos,Sesame,IBM KryptoKnight(凭证库思想)等。Kerberos是由麻省理工大学发明的安全
    认证服务,当前版本V5,已经被UNIX和Windows作为默认的安全认证服务集成进操作系统。
    (3)Agent-based(基于代理人)
    在这种解决方案中,有一个自动地为不同的应用程序认证用户身份的代理程序。这个代理程序
    需要设计有不同的功能。比如, 它可以使用口令表或加密密钥来自动地将认证的负担从用户移开。
    代理人被放在服务器上面,在服务器的认证系统和客户端认证方法之间充当一个"翻译"。例如SSH等。
    (4)Token-based,例如SecurID,WebID,
    现在被广泛使用的口令认证,比如FTP,邮件服务器的登录认证,这是一种简单易用的方式,实现一个口令
    在多种应用当中使用。
    (5)基于网关
    Agent and Broker-based,这里不作介绍。
    (6)基于安全断言标记语言(SAML)实现,SAML(Security Assertion Markup Language,安全断言标记语言)
    的出现大大简化了SSO,并被OASIS批准为SSO的执行标准。开源组织OpenSAML 实现了 SAML 规范,
    可参考http://www.opensaml.org/
    CAS由耶鲁大学开发的单点登录系统(SSO,single sign-on),应用广泛,具有独立于平台的,易于理解,
    支持代理功能。


  • 相关阅读:
    【React Native】某个页面禁用物理返回键
    【React Native】DeviceEventEmitter监听通知及带参数传值
    转载【React Native代码】手写验证码倒计时组件
    【React Native】 中设置 APP 名称、应用图标、为安卓添加启动图
    【React Native错误集】* What went wrong: Execution failed for task ':app:installDebug'.
    【React Native错误集】Import fails with "Failed to execute 'ImportScripts' on 'WorkerGlobalScope'"
    【React Native错误集】Android error “Could not get BatchedBridge, make sure your bundle is packaged properly” on start of app
    「React Native笔记」在React的 setState 中操作数组和对象的多种方法(合集)
    【React Native】Error: Attribute application@allowBackup value=(false) from AndroidManifest.xml
    坚果云如何使用二次验证码/谷歌身份验证器/两步验证/虚拟MFA?
  • 原文地址:https://www.cnblogs.com/riskyer/p/3292054.html
Copyright © 2011-2022 走看看