zoukankan      html  css  js  c++  java
  • Discuz3.2与Java 项目整合单点登陆

           JAVA WEB项目与Discuz 论坛整合的详细步骤完全版目前未有看到,最近遇到有人在问,想到这个整个不是一时半会也解释不清楚。便把整个整合过程以及后续碰到的问题解决方案写下,以供参考。

    原理

           Discuz 和 JAVA 对接需要一个中间件,它就是 Ucenter。Comsenz(康盛)的 UCenter 当前在国内的单点登录领域占据绝对份额,其完整的产品线令 UCenter 成为了账号集成方面事实上的标准。基于 UCenter,可以将 Comsenz 旗下的 Discuz!(社区论坛系统)、SupeSite(门户CMS系统)、X-Space(博客系统)从用户资源层面进行无缝整合,使得账号实现统一管理,在任何一个系统中进行注册、登录、注销等操作时,该账号在其他系统中的会话状态也将同步更新,最终实现一号通的单点登录模式。

           使用 UCenter 进行同步操作,主要依托于 Ucenter Server 和 Ucenter Client之间的 api 接口进行通讯。要使得通讯成为可能,首先要通过 Ucenter 管理所用应用(通过配置使得当前应用和 Ucenter 产生联系,也就是通讯成功)。其他应用通过挂接到 Ucenter 的接口上,从而使得某些数据可以进行同步操作。

    整个分为两大部分:

                               1.整合部分(包括代码嵌入、UCenter配置、方法调用)

                               2.问题部分(如何免激活登陆、中文登录名乱码问题等)

    整合部分

            首先,当然是进行项目整合。

            开始这一部分的前提是你的论坛已经启动并且安装好UCenter。

            如果论坛没有安装可以参考上篇 --------------->  从零开始 CentOs 7 搭建论坛BBS Discuz_X3.2

            据了解 Discuz3.x 以下的版本是不带 UCenter 的,之前的就不去探讨了,如果没有的话另外安装就行。这边3.2版的论坛已经集成好了。

            

            1、使用 admin 登陆论坛的 UCenter 控制中心,这个地方就是用 admin 登陆后进入到管理中心就可以看到菜单如下。

                image

            2、进入UCenter 后,点击左边菜单“应用管理”,右边会默认出现一条信息,这是当前的论坛,UCenter 默认将论坛纳入到了统一管理,这个时候就要进行我们的新应用(JAVA WEB)的添加,理论上是可集成任何项目,这也是康盛开发这个统一用户管理中心的目的,废话不多说下面开始配置我们的项目吧。

            3、点击当前页面上的“添加新应用”,进行WEB项目配置如下图。

                imageimage

                 ID:这个记住,配置WEB项目时需要。

                 应用类型:这个可以根据自己的项目选,如果不在里面的选项选“其他”,这个应该对集成影响不大,猜想应该是UCenter对存在的这几种类型的应用有更好的优化支持。

                 应用名称:这个就随意了,写项目名称可以,别的也行,只是为了自己能区分。

                 应用的主URL:填自己的 JAVA_WEB 项目主访问路径,结尾带不带“/”貌似并不像它提示的那样有影响。我这边是都可以的,不过为了避免集成过程中出现未知问题,先按这个来配,路径结尾不带“/”,成功后你可以测试下路径带“/”。

                 通信密钥:这个任意字符,但一定要和JAVA_WEB里面的配置文件一致。后面WEB配置会提到。

                 应用接口文件名称:uc.php ,这个是默认的,如果改了请恢复,UCenter在与其通信时会自动转换为 /api/uc.php 的格式

                 是否开启同步登陆:是

                 是否接受通知:是


              

                 这样整个应用添加就完成了,直接提交返回到“应用管理”的主页面看,会发现多了一条信息,这个就是你配置的应用了。

                 image

                 好的,相信聪明的你已经发现问题了,一个大红X通信失败,不用担心,因为我们的Web端还需要一些配置。

            4、进行Java Web端的配置

                 a. 我们需要discuz java api的支持,里面包含 jar 和源码,下载地址:http://code.google.com/p/discuz-ucenter-api-for-java,当然很多朋友估计是打不开这个网站的,如果没办法下载,有需要可以联系我

                 b. 将下载的架包放到自己的项目中,也可以将源码直接放到项目里。结构如下

                     image

                     src/api/ucenter/Base64.java

                     src/api/ucenter/Client.java: 将常用的 UCenter 操作封装成的客户端对象,我们在项目中主要用它来与 UCenter 打交道

                     src/api/ucenter/PHPFunctions.java

                     src/api/ucenter/UC.java: 本地的 JAVA 项目用来接收 UCenter 同步命令的 Servlet接口,其访问地址必须为: /api/uc.php

                     src/api/ucenter/XMLHelper.java

                     src/config.properties:本地的JAVA项目与UCenter的接口配置文件( 需要根据实际环境进行配置 )

                     WebRoot/WEB-INF/web.xml: 主要就是将 src/api/ucenter/UC.java 定义为 Servlet

            5、进行config.properties配置

    #
    # ================================================
    # * Discuz! Ucenter API for JAVA
    # ================================================
    # UC comunication settings
    #  
    # 
    #uc server url
    UC_API = http://10.10.10.14/upload/uc_server
     
    #uc ip address 可留空
    UC_IP = 10.10.10.14
    
    #key
    UC_KEY = 123456789
    
    #appid 这里对应的就是你在 UCenter 新添加应用的时候ID
    UC_APPID = 2
    
    #connect mode: default value is ""
    UC_CONNECT = 

            6、进行 web.xml 配置,添加下面这段。

    <servlet>
        <servlet-name>api</servlet-name>
        <servlet-class>com.discuz.interfaces.bbs.api.UC</servlet-class>
        <load-on-startup>2</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>api</servlet-name>
        <url-pattern>/api/uc.php</url-pattern>
    </servlet-mapping>

            7、整个配置就完成了,启动 Web 服务器后,打开 UCenter 控制台可以看到应用已经通讯成功了。

            8、下面就是代码整个注册、登陆、退出了。我主要是想由 UCenter 来统一管理用户,所以用户标准以 UCenter 为准,下面是我测试写的 demo,各位仅作参考

                     a. 注册
    public String execute() {
    
            ActionContext ctx = ActionContext.getContext();
            String tipStr ="";
            Client uClient = new Client();
            String $returns = uClient.uc_user_register(user.getUserName(), user.getPassword(), user.getEmail());
            
            int $uid = Integer.parseInt($returns);
            if ($uid <= 0) {  
                if ($uid == -1) {  
                   tipStr = "用户名不合法!!";  
                } else if ($uid == -2) {  
                   tipStr = "包含要允许注册的词语!!";  
                } else if ($uid == -3) {  
                   tipStr = "用户名已经存在!!";  
                } else if ($uid == -4) {  
                   tipStr = "Email 格式有误!!";  
                } else if ($uid == -5) {  
                   tipStr = "Email 不允许注册!!";  
                } else if ($uid == -6) {  
                   tipStr = "该 Email 已经被注册!!";  
                } else {  
                   tipStr = "未定义!!!";  
                }  
            } else {  
                System.out.println("OK:" + $returns);
                if(new UserDAOImpl().addUser(user)){
                    return SUCCESS;
                }else {
                    tipStr = "平台数据库插入失败!";
                }
            }  
            
            ctx.put("tip", tipStr);
            return ERROR;
    
        }
                        b. 登陆
    public String execute() {
    
            ActionContext ctx = ActionContext.getContext();
            String tipStr = "";
            if (!"".equals(user.getUserName())) {
    
                // 获取Ucenter的登陆结果,同步其他应用的登陆状态
                  Client uc = new Client();
                String result = uc.uc_user_login(user.getUserName(), user.getPassword());
    
                LinkedList<String> rs = XMLHelper.uc_unserialize(result);
                if (rs.size() > 0) {
                    int $uid = Integer.parseInt(rs.get(0));
                    String $username = rs.get(1);
                    String $password = rs.get(2);
                    String $email = rs.get(3);
                    if ($uid > 0) {
                        System.out.println("Ucenter登陆成功: " + $username + " " + $password + " " + $email);
                        String $ucsynlogin = uc.uc_user_synlogin($uid);
                        System.out.println("Ucenter登陆成功: " + $ucsynlogin);
                        
                        // 进行自己系统的登陆权限判断
                        if (user.getPassword().equals(new UserDAOImpl().checkUser(user.getUserName()))) {
                            ctx.put("uclogin", $ucsynlogin);
                            ctx.getSession().put("user", user);
                            return SUCCESS;
                        }
                    }else if( $uid == -1) {
                        tipStr = "用户不存在,或者被删除!";
                    }else if( $uid == -2) {
                        tipStr = "密码错误!";
                    }else {
                        tipStr = "未定义!";
                    }
                    ctx.put("tip", tipStr);
                    return ERROR;
                }
                ctx.put("tip", result);
            }
            return ERROR;
    
        }

                   上面标黄部分 $ucsynlogin ,需要把它存到session中,然后在登陆成功的主页面上调用一下,一定要!其原理就是相当于让浏览器去访问下自己应用与另外一个应用,分别同步下双方的cookie等操作。它的值如下:

    <script type="text/javascript" src="http://192.168.15.110:8080/nocopy/api/uc.php?time=1295926163&code=c8d08KSlEZlDk4tTsjChzRYzZp2EpUierc%2FS3NLnFUviig8HvTnDNymm080JxI8Byl%2F1TW%2FveKQRlR14Io9pvR9eMD1F%2FAH3l1tuzWt3Rw9MQLrK5Lz0q8eMn5%2BAae92YBwwNlWiFWHyfyh%2FzUNC%2FA3HFnEgdX%2F61IwV" reload="1"></script

                    页面上直接取到这个值就行了。

    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
            <title>高大上的店</title>
            <link rel="stylesheet" href="./css/style.css" type="text/css">
            <script src="./js/jquery.js" type="text/javascript"></script>
            <script src="./js/itpbase.js" type="text/javascript"></script>
            <script src="./js/iframe_auto_height.js" type="text/javascript"></script>
            <script src="./js/menuTree.js" type="text/javascript"></script>
        </head>
    
        ${uclogin}
    
        <body bgcolor="#EBF9FA">
        <form action="">
         </form>
        </body>
    
    </html>
                 c、登出

             同上一样的操作,页面上需要加载 $ucsynlogout 。

    public String execute() {
    
            ActionContext ctx = ActionContext.getContext();
            String tipStr = "";
            // 获取Ucenter的登陆结果,同步其他应用的登陆状态
            Client uc = new Client();
            String $ucsynlogout = uc.uc_user_synlogout();
            if ($ucsynlogout != null) {
                ctx.getSession().clear();
                ctx.put("uclogout", $ucsynlogout);
    //            System.out.println("退出成功:" + $ucsynlogout);
                return SUCCESS;
            }
            ctx.put("tip", $ucsynlogout);
            return ERROR;
    }
  • 相关阅读:
    Linnia学习记录
    漫漫考研路
    ENS的学习记录
    KnockoutJS 3.X API 第四章 数据绑定(4) 控制流with绑定
    KnockoutJS 3.X API 第四章 数据绑定(3) 控制流if绑定和ifnot绑定
    KnockoutJS 3.X API 第四章 数据绑定(2) 控制流foreach绑定
    KnockoutJS 3.X API 第四章 数据绑定(1) 文本及样式绑定
    KnockoutJS 3.X API 第三章 计算监控属性(5) 参考手册
    KnockoutJS 3.X API 第三章 计算监控属性(4)Pure computed observables
    KnockoutJS 3.X API 第三章 计算监控属性(3) KO如何实现依赖追踪
  • 原文地址:https://www.cnblogs.com/laramia/p/5066579.html
Copyright © 2011-2022 走看看