>  기사  >  백엔드 개발  >  PHP가 다중 사이트 공유 보기를 통해 Single Sign-On을 구현하는 방법(코드 예)

PHP가 다중 사이트 공유 보기를 통해 Single Sign-On을 구현하는 방법(코드 예)

不言
不言원래의
2018-09-01 09:47:202678검색

이 글의 내용은 공유 시온을 통해 PHP가 싱글 사인온(코드 예제)을 구현하는 방법에 대한 것입니다. 필요한 친구들이 참고할 수 있기를 바랍니다.

최근 한가해서 싱글사인온 문제를 정리해봤습니다.

Single Sign-On의 기본 원칙은 클라이언트가 세션 ID를 공유하고 서버가 세션 정보를 공유한다는 것입니다. 공통 sessionid를 통해 서버 측에서 동일한 세션 정보를 얻음으로써 Single Sign-On의 목적을 달성할 수 있습니다(즉, 여러 사이트가 사용자 정보를 공유하고 한 곳에서 로그인하여 어디서나 사용할 수 있음).

Single Sign-On은 두 가지 상황으로 나뉩니다.

1. 사이트가 동일한 서버에 배포되고 동일한 2차 도메인 이름을 사용합니다.

이 경우 해결하기가 더 쉽습니다.

1. 먼저 클라이언트 측에서 사이트의 세션 ID(쿠키에 존재)를 공유하는 문제를 해결하세요. ini_set() 함수를 사용하여 다음과 같이 쿠키의 도메인을 지정합니다. <code><span style="font-size: 14px;"></span>
ini_set(&#39;session.cookie_domain&#39;, &#39;.xxxx.com&#39;);
//设置服务器cookie的域,xxxx为公用二级域名
2. 둘째, 사이트의 세션 정보를 공유하는 문제를 해결합니다. 서버 측. 사이트가 동일한 서버에 있기 때문에 생성된 세션 파일은 공개되며 sessionid를 직접 사용하여 해당 세션 정보를 얻을 수 있습니다.

2. 사이트가 다른 서버에 배포되고 다른 도메인 이름을 사용하므로 이 상황은 더 복잡합니다. Ini_set은 클라이언트 측에서 쿠키 범위를 설정하는 데 사용할 수 없습니다. 서버 측에서도 별도로 생성됩니다. 내 세션 파일은 공유할 수 없지만 여전히 솔루션을 사용합니다.

1. 먼저 클라이언트 세션 ID 동기화 문제를 해결하세요.
3개의 사이트가 있고 도메인 이름은 aa.com, bb.com, cc.com이라고 가정합니다. aa.com에 공통 로그인 포털인 login.php를 생성하면 세 웹사이트의 모든 로그인 요청이 이 페이지로 이동합니다. 코드 과정은 다음과 같습니다.

    $back = login($name,$pwd);//执行登陆操作,成功就写入session
    //如果登录成功,进行以下操作流程
    if($back){
            $sessionid = session_id();        
            $key = encode($session,$keyword);//生成安全码
        //输出一个登陆成功提示页,并跳转到请求登陆的站点
    }

로그인 성공 html 프롬프트 페이지에 다음 코드를 추가하고 iframe 태그를 사용하여 동시에 로그인이 필요한 사이트를 요청합니다


PHP가 다중 사이트 공유 보기를 통해 Single Sign-On을 구현하는 방법(코드 예) aa.com 및 cc.com 사이트의 set_cookie.php 파일은 다음과 같습니다.

//解密
$keydecode($key);
//把当前站点的sessionid设置为传递的sessionid
session_id($_GET[&#39;sessionid&#39;]);
session_start();

2. 세 사이트 간의 서버측 세션 공유 문제를 해결합니다.
앞서 언급했듯이 세 사이트가 동일한 서버에 있지 않기 때문에 해당 파일을 공유하려는 경우 일련의 도메인 간 문제에 직면하게 됩니다. 그래서 우리는 생각을 바꿔서 세션 정보를 파일로 저장하는 대신 세션 정보를 데이터베이스에 저장했습니다. 이렇게 하면 세션 정보의 세션 ID만 알면 어느 사이트에서나 동일한 세션 정보에 접근할 수 있습니다.

세션 정보를 데이터베이스에 저장하기 위해 mysql_session.php 파일을 생성합니다. 코드는 다음과 같습니다.

$gb_DBname="test";                        //数据库名称 
$gb_DBuser="root";                        //数据库用户名称 
$gb_DBpass="";                            //数据库密码 
$gb_DBHOSTname="127.0.0.1";               //主机的名称或是IP地址 
$SESS_DBH="";                           //数据库对象
session_module_name("User");            //定义session存储按用户定义的方式
$SESS_LIFE=get_cfg_var("session.gc_maxlifetime");//得到session的最大有效期,也可以自定义
function sess_open($save_path,$session_name){ 
    global $gb_DBHOSTname,$gb_DBname,$gb_DBuser,$gb_DBpass,$SESS_DBH; 
    if(!$SESS_DBH=mysql_pconnect($gb_DBHOSTname,$gb_DBuser,$gb_DBpass)){ 
    echo "MySql Error:".mysql_error().""; 
    die(); 
    } 
    if(!mysql_select_db($gb_DBname,$SESS_DBH)){ 
    echo "MySql Error:".mysql_error().""; 
    die(); 
    } 
    return true; 
} 
function sess_close(){ return true; 
} 
function sess_read($key){ 
    global $SESS_DBH,$SESS_LIFE; 
    $qry="select value from db_session where sesskey = &#39;$key&#39; and expiry > ".time(); 
    $qid=mysql_query($qry,$SESS_DBH); 
    if(list($value)=mysql_fetch_row($qid)){ 
    return $value; 
    } 
    return false; 
}
//写入session信息。保存session信息的数据表名为:db_session
//除了主键自增id,需要的字段如下
//sesskey   sessionid
//values    session值
//expiry    session的到期日期
function sess_write($key,$val){ 
    global $SESS_DBH,$SESS_LIFE; 
    $expiry=time()+$SESS_LIFE; 
    $value=$val; 
    $qry="insert into db_session values(&#39;$key&#39;,$expiry,&#39;$value&#39;)"; 
    $qid=mysql_query($qry,$SESS_DBH); 
    if(!$qid){ 
    $qry="update db_session set expiry=$expiry, value=&#39;$value&#39; where sesskey=&#39;$key&#39; and expiry >".time(); 
    $qid=mysql_query($qry,$SESS_DBH); 
    } 
    return $qid; 
} 
function sess_destroy($key){ 
    global $SESS_DBH; 
    $qry="delete from db_session where sesskey = &#39;$key&#39;"; 
    $qid=mysql_query($qry,$SESS_DBH); 
    return $qid; 
} 
function sess_gc($maxlifetime){ 
    global $SESS_DBH; 
    $qry="delete from db_session where expiry < ".time(); 
    $qid=mysql_query($qry,$SESS_DBH); 
    return mysql_affected_rows($SESS_DBH); 
} 

session_set_save_handler("sess_open","sess_close","sess_read","sess_write","sess_destroy","sess_gc");

그런 다음 세션을 사용해야 하는 페이지에서 session_start() 전에 파일을 도입합니다. 보통 seesion을 사용합니다. 할당한 세션이 데이터베이스에 저장되어 있음을 알 수 있습니다.

관련 권장 사항:

thinkphp 2차 도메인 이름 사이트 세션 공유(싱글 사인온)

php는 웹 시스템에 대한 싱글 사인온을 실현합니다

위 내용은 PHP가 다중 사이트 공유 보기를 통해 Single Sign-On을 구현하는 방법(코드 예)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.