UCenter跨域、单点登陆机制分析

看了很多博文,终于明白ucenter怎么和uchome进行通信了,首先要明白 uchome 是通过cookie技术 去验证有无登录的,在登录成功后,默认会产生uchome_loginuser和 uchome_auth的Cookie值,而这两个cookie 是有作用域的,所以要想其他的域也有登录名,必须跨域传 用户名和密码等,在进行验证;下面介绍下如何实现的?
     uchome登陆时访问 source/do_login.php 的getpassport函数,getpassport通过uc_client 直接连ucenter的 数据库 ,实现当前站点的登陆,会产生自己域的cookie,实现自己域下面用户登录验证;
在do_login.php 有
         //同步登录
       if ($_SCONFIG['uc_status'])
       {
              include_once S_ROOT . './uc_client/client.php';
              $ucsynlogin = uc_user_synlogin($setarr['uid']);
       }
$_SCONFIG['uc_status']为 uc状态,这里已在common.php 中有定义,如果不是当前应用则为1,然后看client.php的uc_user_synlogin函数

function uc_user_synlogin($uid) {
       $uid = intval($uid);
       $return = uc_api_post('user', 'synlogin', array('uid'=>$uid));
       return $return;
}
uc_api_post('user', 'synlogin', array('uid'=>$uid)是打开ucenter下的指定action 这里是control/user.php的onsynlogin方法,同时传递参数uid,关于如何打开ucenter 函数在uc_api_post;
在onsynlogin方法中
function onsynlogout() {
              $this->init_input();
              if($this->app['synlogin']) {
                     $synstr = '';
                     foreach($this->cache['apps'] as $appid => $app) {
                            if($app['synlogin'] && $app['appid'] != $this->app['appid']) {
                                   $synstr .= '<script type="text/javascript" src="'.$app['url'].'/api/'.$app['apifilename'].'?time='.$this->time.'&code='.urlencode($this->authcode('action=synlogout&time='.$this->time, 'ENCODE', $app['authkey'])).'" reload="1"></script>';
                            }
                     }
                     return $synstr;
              }
              return '';
       }
onsynlogin 函数通过循环,对系统下的所有应用(在data/cache/setting.php)做JS调用
在js中对每个应用下的api/uc.php 进行访问并进行cookie设置
返回到uchome.在每 个应用下的api目录有个uc.php文件查找$action == 'synlogin'下面是进行cookie设置
function synlogin($get, $post) {
              global $_SGLOBAL;
            
              if(!API_SYNLOGIN) {
                     return API_RETURN_FORBIDDEN;
              }
     

              obclean();
              header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
     
              $cookietime = 31536000;
              $uid = intval($get['uid']);
              $query = $_SGLOBAL['db']->query("SELECT uid, username, password FROM ".tname('member')." WHERE uid='$uid'");
              if($member = $_SGLOBAL['db']->fetch_array($query)) {
                     include_once S_ROOT.'./source/function_space.php';
                     $member = saddslashes($member);
                     $space = insertsession($member);

                     ssetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);
              }
              ssetcookie('loginuser', $get['username'], $cookietime);
       }
其中obclean();
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
这两 行是必须的
这样就实现了每个域下都有相应的cookie,同步登出亦如此。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,以下是Spring Boot和Vue.js进行单点登录对接的示例: 在Vue.js中,你可以使用axios库来发送HTTP请求。首先,你需要在Vue组件中定义一个方法来处理登录请求,并在该方法中调用后端API进行登录验证。在登录成功后,你可以将返回的token保存到cookie中,并使用window.location.href重定向到主页。 ```javascript methods: { submitLogin() { login.submitLoginUser(this.user) .then(response => { cookie.set('guli_token', response.data.data.token, { domain: 'localhost' }); login.getLoginUserInfo() .then(response => { this.loginInfo = response.data.data.userInfo; cookie.set('aokill_ucenter', this.loginInfo, { domain: 'localhost' }); }); window.location.href = "/"; }); } } ``` 在Spring Boot中,你可以使用Spring Security来处理用户认证和授权。首先,你需要创建一个登录接口,用于接收前端发送的登录请求,并返回一个包含token的响应。然后,你可以创建一个获取用户信息的接口,根据token从数据库中获取用户信息并返回给前端。 ```java @RestController @RequestMapping("/educenter/member") public class MemberController { @PostMapping("/login") public ResponseEntity<?> login(@RequestBody Member member) { // 处理登录逻辑,验证用户名和密码 // 生成token并返回给前端 String token = generateToken(member); return ResponseEntity.ok(new LoginResponse(token)); } @GetMapping("/getMemberInfo") public ResponseEntity<?> getMemberInfo(@RequestHeader("Authorization") String token) { // 根据token从数据库中获取用户信息 MemberInfo memberInfo = getMemberInfoByToken(token); return ResponseEntity.ok(memberInfo); } // 其他方法和逻辑... } ``` 请注意,上述示例仅为演示目的,并未完整实现单点登录的所有功能。实际应用中,你还需要配置Spring Security的认证和授权规则,以及实现token的生成和验证逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值