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 登陆后进入到管理中心就可以看到菜单如下。
2、进入UCenter 后,点击左边菜单“应用管理”,右边会默认出现一条信息,这是当前的论坛,UCenter 默认将论坛纳入到了统一管理,这个时候就要进行我们的新应用(JAVA WEB)的添加,理论上是可集成任何项目,这也是康盛开发这个统一用户管理中心的目的,废话不多说下面开始配置我们的项目吧。
3、点击当前页面上的“添加新应用”,进行WEB项目配置如下图。
ID:这个记住,配置WEB项目时需要。
应用类型:这个可以根据自己的项目选,如果不在里面的选项选“其他”,这个应该对集成影响不大,猜想应该是UCenter对存在的这几种类型的应用有更好的优化支持。
应用名称:这个就随意了,写项目名称可以,别的也行,只是为了自己能区分。
应用的主URL:填自己的 JAVA_WEB 项目主访问路径,结尾带不带“/”貌似并不像它提示的那样有影响。我这边是都可以的,不过为了避免集成过程中出现未知问题,先按这个来配,路径结尾不带“/”,成功后你可以测试下路径带“/”。
通信密钥:这个任意字符,但一定要和JAVA_WEB里面的配置文件一致。后面WEB配置会提到。
应用接口文件名称:uc.php ,这个是默认的,如果改了请恢复,UCenter在与其通信时会自动转换为 /api/uc.php 的格式
是否开启同步登陆:是
是否接受通知:是
这样整个应用添加就完成了,直接提交返回到“应用管理”的主页面看,会发现多了一条信息,这个就是你配置的应用了。
好的,相信聪明的你已经发现问题了,一个大红X通信失败,不用担心,因为我们的Web端还需要一些配置。
4、进行Java Web端的配置
a. 我们需要discuz java api的支持,里面包含 jar 和源码,下载地址:http://code.google.com/p/discuz-ucenter-api-for-java,当然很多朋友估计是打不开这个网站的,如果没办法下载,有需要可以联系我
b. 将下载的架包放到自己的项目中,也可以将源码直接放到项目里。结构如下
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;
}
Discuz3.2与Java 项目整合单点登陆的更多相关文章
- Java电商项目-8.实现SSO单点登陆
目录 创建ashop-sso-web单点登陆系统 用户名唯一性验证 用户注册 用户登陆 获得用户登陆状态 实现安全退出 项目的Github地址 创建ashop-sso-web单点登陆系统 先创建好模块 ...
- UCenter在JAVA项目中实现的单点登录应用实例
Comsenz(康盛)的UCenter当前在国内的单点登录领域占据绝对份额,其完整的产品线令UCenter成为了账号集成方面事实上的标准. 基于UCenter,可以将Comsenz旗下的Discuz! ...
- SSM项目整合第一步 注册登陆实现
SSM项目整合第一步 注册: 项目目录: 一.数据库建表: 源码: ; -- ---------------------------- -- Table structure for t_user - ...
- 实战突击: Java Web项目整合开发(PDF)
实战突击: Java Web项目整合开发(PDF)
- Apache 整合 Tomcat (首先Apache 发布的是PHP项目,占用端口80,tomcat 发布的是Java 项目,占用端口8080)
情况简介: Apache 整合 Tomcat (首先Apache 发布的是PHP项目,占用端口80,tomcat 发布的是Java 项目,占用端口8080),而现在是虚拟出来两个域名(希望这两个域名都 ...
- Java 银联支付官网demo测试及项目整合代码
注:原文来源与 < Java 银联支付官网demo测试及项目整合代码 > 银联支付(网关支付B2C) 一.测试官网demo a)下载官网开发包,导入eclipse等待修改(下载的开发包没 ...
- Struts2+Hibernate4+Spring4框架整合搭建Java项目原型
收藏 http://www.cnblogs.com/mageguoshi/p/5850956.html Struts2+Hibernate4+Spring4框架整合搭建Java项目原型
- windows中apache+tomcat整合,使php和java项目能够独立运行
一.下载和安装 1.安装php 网上有安装教程,不再赘述 2.安装apache 比如安装目录为e:\apache; 项目根目录为e:\www; 网上有安装教程,不再赘述 3.安装jdk 不再 ...
- Java项目接入sso单点登录
最近在落地cat(java开发的一款开源监控系统)接入公司的内部项目,其中有项需求是接入公司的sso单点登录系统.研究了公司之前java项目接入sso系统,大部分是采用spring框架,然后依赖spr ...
随机推荐
- 自学传说中的php接口编写
一个前端学php,感觉不可思议,但实际上面试中都会问你后台会不会.这时候php就派上用场了. 下面的是我自己百度研究的一个些心得分享一下: html代码 <!DOCTYPE html> & ...
- iTerm2 与 Oh My Zsh的配套使用
详见: https://www.jianshu.com/p/7de00c73a2bb https://github.com/sirius1024/iterm2-with-oh-my-zsh https ...
- pdf下载速度
- ES6新特性-函数的简写(箭头函数)
通常函数的定义方法 var fn = function(...){ ...... } //例如: var add = function(a,b){ return a+b; } //或者: functi ...
- VPS安全配置
VPS安全配置 购买VPS后重装操作系统,以windows server 2008为例. 1 登录服务器 重装操作系统后,第一时间登录服务器,迅速进行安全配置. VPN-->Remote Des ...
- SqlServer xml类型 查询及操作
2.xpath: 寻址语言,类似windows目录的查找(没用过dir命令的话就去面壁) 语法格式,这些语法可以组合为 ...
- ELK+Filebeat 集中式日志解决方案详解
链接:https://www.ibm.com/developerworks/cn/opensource/os-cn-elk-filebeat/index.html?ca=drs- ELK Stack ...
- 在绘图的时候import matplotlib.pyplot as plt报错:ImportError: No module named '_tkinter', please install the python-tk package
在绘图的时候import matplotlib.pyplot as plt报错:ImportError: No module named '_tkinter', please install the ...
- 轻量级集群管理软件-Ansible
ansible概述和运行机制 ansible概述 Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具, 它用Python写成,类似于saltstack和Puppet,但是有一个不同 ...
- MVC(I)
实际开发我们是这样的: