java UCnter 单点登录 对接。
Posted zhouixi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java UCnter 单点登录 对接。相关的知识,希望对你有一定的参考价值。
前提 php项目要部署成功。论坛能正常访问。
先配置 应用
1.是论坛应用
4.是java服务器,也就是你java登录的项目。 必须通信成功。
。主应用IP就是你java项目的入口。 例如:http://192.168.1.100:8080 注意不要写成 http://192.168.1.100:8080/ 后面不要加斜杠。
进 bbs/admin.php
设置好,激活方式。
论坛的配置完了。再配置java项目。
java 项目 resourse 也就是类路径下面。会有一个config.properties 文件 。后面。有说明为什么要有这个。
这个配置自己论坛里面的信息。
这个必须放在java项目里面。
web.xml 加入
https://code.google.com/p/discuz-ucenter-api-for-java/ 项目中的文件。api.ucenter config.perproties 别人整的开源项目。拷贝就行。
配置工作准备完毕
实现java登录 同步到bbs论坛。
java代码:
在java登录通过之后。
登录:
UcSynLogin ucSynLogin = new UcSynLogin();
ucSynLogin.getUcSynLogin(map,password,User);
注册:
UcSynReg reg = new UcSynReg();
reg.ucSynReg(map,password,user);
代码:
/** * @author zhourong * @date 2018/9/27 */ public class UcSynReg extends BaseUcSynLogin { private Logger log = LoggerFactory.getLogger(UcSynReg.class); private UcSynLoginService ucSynLoginService = new UcSynLoingServiceImpl(); public void ucSynReg(Map map, String password, User loginUser){ String userName = loginUser.getUserName(); String email = loginUser.getEmail(); String loginUrl = null ; log.info("用户信息:"+loginUser); log.info("前端返回信息:"+map); log.info("密码:"+password); if (loginUser == null ){ log.info("用户为空"); ucSynLoginService.setMap(map,loginUrl,loginUser); return ; } if(StringUtils.isBlank(email)){ log.info("邮箱为空"); ucSynLoginService.setMap(map,loginUrl,loginUser); return ; } String userId = ucSynLoginService.getSynUserReg(userName,password,email,client); if(StringUtils.isEmpty(userId) || Integer.parseInt(userId) < 1){ ucSynLoginService.setMap(map,loginUrl,loginUser); return ; } loginUrl = ucSynLoginService.getSynLoginUrl(userId,client); log.info("同步登录返回链接:"+loginUrl); ucSynLoginService.setMap(map,loginUrl,loginUser); }
/** * @author zhourong * @date 2018/9/27 */ public class UcSynLogin extends BaseUcSynLogin { private Logger log = LoggerFactory.getLogger(UcSynLogin.class); private static final String ZERO = "0"; private UcSynLoginService ucSynLoginService = new UcSynLoingServiceImpl(); /** * 登录 */ public void getUcSynLogin( Map map, String password,User loginUser){ String loginUrl = null; String userName = loginUser.getUserName(); String userId = null; log.info("入参--->USER:"+loginUser.toString()+"Map:"+map); Long start = System.currentTimeMillis(); if (loginUser == null ){ log.info("用户为空"); ucSynLoginService.setMap(map,loginUrl,loginUser); return ; } String email = loginUser.getEmail(); if(StringUtils.isBlank(email)){ log.info("邮箱为空"); ucSynLoginService.setMap(map,loginUrl,loginUser); return ; } String synUser = ucSynLoginService.getSynUser(userName,client); if(StringUtils.isEmpty(synUser) || ZERO.equals(synUser)){ userId = ucSynLoginService.getSynUserReg(userName,password,email,client); if(StringUtils.isEmpty(userId) || Integer.parseInt(userId) < 1){ ucSynLoginService.setMap(map,loginUrl,loginUser); return ; } loginUrl = ucSynLoginService.getSynLoginUrl(userId,client); log.info("同步登录返回链接:"+loginUrl); } else { LinkedList<String> result = new LinkedList<String>(); result = XMLHelper.uc_unserialize(synUser); if(CollectionUtils.isEmpty(result)){ ucSynLoginService.setMap(map,loginUrl,loginUser); return ; } userId = result.get(0); log.info("用户ID:"+result.get(0)); log.info("用户名:"+result.get(1)); log.info("用户邮箱:"+result.get(2)); loginUrl = ucSynLoginService.getSynLoginUrl(userId,client); log.info("同步登录返回链接:"+loginUrl); } ucSynLoginService.setMap(map,loginUrl,loginUser); Long end = System.currentTimeMillis(); Long time = end - start ; log.info("同步登录访问时间:"+time); log.info("同步返回结果:"+map); return ; } }
/** * @author zhourong * @date 2018/9/27 */ public class UcSynLoingServiceImpl implements UcSynLoginService { private Logger log = LoggerFactory.getLogger(UcSynLoingServiceImpl.class); @Override public String getSynLoginUrl(String userId,Client client ){ try{ String loginUrl = client.uc_user_synlogin(Integer.parseInt(userId)); log.info("同步登录链接:"+loginUrl); return loginUrl; } catch (Exception e) { log.error("获取同步登录信息错误:"+e.getMessage()); } return null; } @Override public String getSynUser(String userName,Client client){ try{ String userXml = client.uc_get_user(userName,0); log.info("获取同步用户信息:"+userXml); return userXml; } catch (Exception e) { log.error("获取同步用户信息失败:"+e.getMessage()); } return null ; } @Override public String getSynUserReg(String userName,String password,String email,Client client){ try{ String userId = client.uc_user_register(userName,password,email); log.info("获取用户ID:"+userId); return userId; } catch (Exception e){ log.error("获取同步注册信息失败:"+e.getMessage()); } return null; } @Override public void setMap(Map map ,String loginUrl,User user){ log.info("同步链接:"+loginUrl); log.info("email:"+user.getEmail()); map.put("loginUrl",loginUrl); map.put("email",user.getEmail()); return ; } }
同步之后。会返回一段js代码。
<script type="text/javascript" src="http://bss/api/uc.php?time=1538017525&code=4f71%2BluBYfNyi8rZSREDp9UDMb%2BNAuDfnkmR1kpqMOeT0ENE7ZNBaY5SGVJVqkBPvotrWCFo7Vq4R0D4XJ9z2LCh0Za8XmRL2sUNVZFYWf3kXqGRDPENLBGHrK52GngCgjoDDoRxzfK7%2FYAAi525hGJWGhs4V30en58yaz7jUVV5DQ" reload="1"></script>
执行一下js代码 。然后访问一下bbs就行了。
/uc_client/client.php
HTTPS: 访问 要采用数据库方式 。同时论坛退出会报301
解决方式:
https://www.itsvse.com/forum.php?mod=viewthread&tid=4798
原:$ port =!empty($ matches [\'port\'])?$ matches [\'port\']:80;
改:$ port =!empty($ matches [\'port\'])?$ matches [\'port\'] :( $ matches [\'scheme\'] ==\'https\'?443:80);
原:if(!$ fp = @fsocketopen(($ ip?$ ip:$ host),$ port,$ errno,$ errstr,$ timeout)){
改:if(!$ fp = @fsocketopen(($ scheme ==\'https\'?\'ssl\':$ scheme)。\'://\'。($ scheme ==\'https\'?$ host:($ ip?$ ip :$ host)),$ port,$ errno,$ errstr,$ timeout)){
以上是关于java UCnter 单点登录 对接。的主要内容,如果未能解决你的问题,请参考以下文章
如何将BI 工具与业务系统进行单点登录对接,实现用户权限通用
Atlassian系列之crowd对接jira,confluence,fisheye单点登录