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);
    }
UcSynReg(注册并登录同步)
/**
 * @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 ;
    }

}
UcSynLogin(同步登录)
/**
 * @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单点登录

ant design pro对接SSO单点登录

SpringBoot应用如何以优雅的方式对接老旧SSO实现单点登录逻辑

操作指南|JumpServer与Okta集成对接

前端单点登录的一个小实现