Maison > développement back-end > tutoriel php > Comment PHP implémente l'authentification unique via une visualisation partagée multi-sites (exemple de code)

Comment PHP implémente l'authentification unique via une visualisation partagée multi-sites (exemple de code)

不言
Libérer: 2023-04-04 06:08:01
original
2704 Les gens l'ont consulté

Le contenu de cet article explique comment PHP implémente l'authentification unique (exemple de code) via une vision partagée. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Je n'ai rien à faire récemment, j'ai donc résumé et réglé les problèmes d'authentification unique.

Le principe de base de l'authentification unique est le suivant : le client partage l'ID de session et le serveur partage les informations de session. En obtenant les mêmes informations de session côté serveur via un identifiant de session commun, l'objectif de l'authentification unique peut être atteint (c'est-à-dire que plusieurs sites partagent des informations utilisateur, se connectent à un seul endroit et peuvent être utilisés partout).

L'authentification unique se divise en deux situations :

1 Le site est déployé sur le même serveur et utilise le même nom de domaine de deuxième niveau

Dans ce cas. , il vaut mieux résoudre.

1. Résolvez d’abord le problème du partage de l’identifiant de session du site (existant dans le cookie) côté client. Utilisez la fonction ini_set() pour spécifier le domaine du cookie, comme suit : <code><span style="font-size: 14px;"></span>
ini_set(&#39;session.cookie_domain&#39;, &#39;.xxxx.com&#39;);
//设置服务器cookie的域,xxxx为公用二级域名
Copier après la connexion
2. Deuxièmement, résolvez le problème du partage des informations de session du site côté serveur. Les sites étant sur le même serveur, les fichiers de session générés sont publics et vous pouvez directement utiliser l'identifiant de session pour obtenir les informations de session correspondantes.

2. Le site est déployé sur différents serveurs et utilise différents noms de domaine

Cette situation est plus compliquée car le site utilise différents noms de domaine sur différents serveurs et ini_set ne peut pas être utilisé pour définissez des cookies sur le périmètre client, côté serveur, chacun génère son propre fichier de session, qui ne peut pas être partagé, mais il existe toujours une solution.
1. Résolvez d’abord le problème de synchronisation des identifiants de session client.

Supposons que nous ayons trois sites, les noms de domaine sont aa.com, bb.com, cc.com. Nous créons un portail de connexion commun login.php sur aa.com, et toutes les demandes de connexion des trois sites Web seront redirigées vers cette page. Le processus de code est le suivant :
    $back = login($name,$pwd);//执行登陆操作,成功就写入session
    //如果登录成功,进行以下操作流程
    if($back){
            $sessionid = session_id();        
            $key = encode($session,$keyword);//生成安全码
        //输出一个登陆成功提示页,并跳转到请求登陆的站点
    }
Copier après la connexion


Ajoutez le code suivant à la page d'invite HTML de connexion réussie et utilisez la balise iframe pour demander le site qui doit être connecté simultanément Comment PHP implémente lauthentification unique via une visualisation partagée multi-sites (exemple de code)

Les fichiers set_cookie.php des sites aa.com et cc.com sont les suivants
//解密
$keydecode($key);
//把当前站点的sessionid设置为传递的sessionid
session_id($_GET[&#39;sessionid&#39;]);
session_start();
Copier après la connexion
2. Résoudre le problème du partage de sessions côté serveur entre les trois sites.

Comme mentionné précédemment, comme les trois sites ne sont pas sur le même serveur, leurs propres fichiers de session seront générés. Si vous souhaitez partager ces fichiers, vous serez confronté à une série de problèmes inter-domaines. . Nous avons donc changé notre façon de penser et au lieu d'utiliser des fichiers pour enregistrer les informations de session, nous avons enregistré les informations de session dans la base de données. De cette manière, tant que l'ID de session des informations de session est obtenu, n'importe quel site peut accéder aux mêmes informations de session.

Nous créons un fichier mysql_session.php pour stocker les informations de session dans la base de données. Le code est le suivant
$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");
Copier après la connexion

Dans la page où la session doit être utilisée, introduisez le fichier avant session_start. () , le reste peut être utilisé comme d'habitude avec seesion. Vous constaterez que la session que vous avez attribuée a été stockée dans la base de données.

Recommandations associées :

partage de session de site de nom de domaine de deuxième niveau thinkphp (authentification unique)

php réalise système Web unique Cliquez pour vous connecter

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal