htc 发表于 2020-3-18 17:25:52

[转]iTop集成SSO登录

https删除://www.删除 删除/article-3553.html优化登录2016.7.20更新由于绝大多数用户都通过sso登录,因此决定未认证用户之间重定向至sso以提高用户体验。只需要在model.authent-sso.php中class定义的外面判断是否登录,未登录的跳转去sso(注意请求uri为toolkit和setup时不要跳转到sso,否则将导致这两个功能不可用)。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

//cron任务忽略sso认证
if(isset($_SERVER['REQUEST_URI'))
{
        //如果访问 toolkit 或者 setup 等工具页面,则不跳转到sso
        $isToolPage = false;
        if(preg_match('/^\/toolkit\/|^\/webservices\/|^\/setup\//i',$_SERVER['REQUEST_URI'))
        {
                $isToolPage = true;
        }
        if(!isset($_SESSION['auth_user') && !$isToolPage)
        {
                UserLeSSO::getM_TK(base64_encode($_SERVER['REQUEST_URI'));
        }
}







其中参数 $_SERVER['REQUEST_URI'] 用于认证通过后重定向至登录前的链接。具体流程为记录用户登录前打开的request_uri, 作为url参数加到sso的next URL里,然后login.php就可以获取到这个uri,认证成功后直接重定向至该request_uri。getM_TK()函数修改为:


1
2
3
4
5
6
7
8
9

static public function getM_TK($uri="")
{
    $sAppRootUrl = trim(MetaModel::GetConfig()->Get('app_root_url'));
    $loginPage = "env-production/authent-sso/login.php";
    $sLoginURL = trim(MetaModel::GetModuleSetting('authent-sso', 'login_url', 'http://localhost'));
    $next = $sAppRootUrl . $loginPage . "?uri=" . $uri;
   
    header("Location: ". $sLoginURL . "?next=" . $next);
}





接下来在login中处理


1
2
3
4
5
6
7
8
9

$appRootUrl = UserLeSSO::getAppRootUrl(false);
....
....

if(UserRights::CheckCredentials(SSOUSER,'') === true)
{
    $location = $appRootUrl . base64_decode($_GET['uri');
    header("Location: $location");
}





为了取到不带URI的app_root_url,getAppRootUrl()函数修改为:


1
2
3
4
5
6
7
8
9
10
11
12

static public function getAppRootUrl($with_uri=true)
{
    if($with_uri)
    {
      return trim(MetaModel::GetConfig()->Get('app_root_url')) . "pages/UI.php";
    }
    else
    {
      $root_url = trim(MetaModel::GetConfig()->Get('app_root_url'));
      return preg_replace("/\/$/","",$root_url);
    }
}





页: [1]
查看完整版本: [转]iTop集成SSO登录