ホームページ > バックエンド開発 > PHPチュートリアル > PHPはチケットを一律発行することでシングルサインインSSO機能を実現

PHPはチケットを一律発行することでシングルサインインSSO機能を実現

WBOY
リリース: 2016-06-13 12:19:13
オリジナル
1224 人が閲覧しました

PHP は、チケットを一律に発行することでシングル サインオン SSO 機能を実装します。

サイト a、サイト b、およびサイト c は、それぞれ、サイト a およびサイト c のログイン要求として機能します。サイト b とサイト c に転送されます。統合ログイン、登録センター (サードパーティ ID 認証センターとも呼ばれます) として使用され、ユーザーはログイン検証を完了した後、サードパーティ認証センターにログインします。ユーザーのログイン情報を含む暗号化キーが生成され、暗号化キーを含むブート ページを使用して複数の異なるサブアプリケーションが生成されるため、ユーザーはサブアプリケーションのブート ページに入るか、サブページの認証を完了するかを自由に選択できます。そのため、サブアプリケーションのログイン入り口に個別にログインする必要はありません。効果を確認してください:


サイト a からログインします。ログインに成功したら、サードパーティのログイン ガイダンス インターフェイスに入ります:


ボタンを押して、ステーション A ガイダンス センターに入ります。



ボタンから統一キーを追加し、ステーション C ガイダンスセンターに入ります




サイト b の代理ログインが実装されており、センター b に限り、サイト a と c のログインが実装されています。 、追加 複数のサブサイト リストを使用すると、1 つのログイン、登録センター、およびすべてのサブアプリケーションの自動ログインを実現する 1 つのキーを実現でき、従来のサブアプリケーションの個別ログインの問題を置き換え、ユーザーの操作プロセスを簡素化できます。


公共機能

<?phpfunction chksecret($secret){	$key=decode($secret);	$arr = explode(",",$key);	if(isset($arr[3]) && $arr[3]=="verifyok"){				$_SESSION[&#39;username&#39;]=$arr[1];		$_SESSION[&#39;login&#39;]=$arr[3];			}else{	    $url=gethost();		echo "<script>alert('登陆失败!');window.location.href='".$url."';</script>";	}}function gethost(){	return "http://".$_SERVER['HTTP_HOST'];}function chklogin(){	if(isset($_SESSION['login']) && $_SESSION['login']=='verifyok'){			}else{	    $host=gethost();		header("location:$host");	}}function decode($string = '', $skey = 'lmj951753') {    $strArr = str_split(str_replace(array('O0O0O', 'o000o', 'oo00o'), array('=', '+', '/'), $string), 2);    $strCount = count($strArr);    foreach (str_split($skey) as $key => $value)        $key <= $strCount && $strArr[$key][1] === $value && $strArr[$key] = $strArr[$key][0];    return base64_decode(join(&#39;&#39;, $strArr));}function encode($string = &#39;&#39;, $skey = &#39;lmj951753&#39;) {    $strArr = str_split(base64_encode($string));    $strCount = count($strArr);    foreach (str_split($skey) as $key => $value)        $key < $strCount && $strArr[$key].=$value;    return str_replace(array(&#39;=&#39;, &#39;+&#39;, &#39;/&#39;), array(&#39;O0O0O&#39;, &#39;o000o&#39;, &#39;oo00o&#39;), join(&#39;&#39;, $strArr));}?>
ログイン後にコピー


ステーションのログイン入り口:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"><head>	<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">	<title>a站点</title></head><body>	<h1>这是a站</h1>	<div>		<form action="http://www.b.com/ssologin.php" method="post">			<p>用户名:<input type="text" name="username" /></p>			<p>密  码:<input type="text" name="password" /></p>			<p><input type="submit" name=&#39;btn&#39; value="登陆"/></p>		</form>	</div></body></html>
ログイン後にコピー


ステーションガイドページ:

<?phprequire_once(&#39;function.php&#39;);session_start();$secret=isset($_GET[&#39;key&#39;])?trim($_GET[&#39;key&#39;]):&#39;&#39;;if($secret){	chksecret($secret);}else{	chklogin();}?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"><head>	<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">	<title>登陆引导中心</title></head><body>	<p>欢迎回来!这里是A站点<?php echo $_SESSION[&#39;username&#39;] ?></p>	<p><a href=&#39;http://www.a.com/admin.php&#39;>管理中心		</a>  <a href=&#39;http://www.a.com/logout.php&#39;>退出</a>	</p></body></html>
ログイン後にコピー
sso ログインセンター:


<?phpheader("Content-type:text/html;charset=utf-8");$refer=$_SERVER[&#39;HTTP_REFERER&#39;];$username=isset($_POST[&#39;username&#39;])?trim($_POST[&#39;username&#39;]):&#39;&#39;;$password=isset($_POST[&#39;password&#39;])?trim($_POST[&#39;password&#39;]):&#39;&#39;;if(empty($username) || empty($password)){	goback($refer);}$application=array(//根据子站点需要,添加应用列表	array(&#39;name&#39;=>'进入A应用','url'=>'http://www.a.com/'),	array('name'=>'进入C应用','url'=>'http://www.c.com/'));if($username=="admin" && $password=="123456"){	$str=time().','.$username.",".$password.",verifyok,".$refer;    $key=encode($str);    echo "登陆成功!".$username.'<br/>';    foreach ($application as $k => $v) {		if($refer==$v['url']){			echo "<a target=&#39;_blank&#39; style=&#39;color:red;font-weight:bold&#39; href=&#39;".$v[&#39;url&#39;]."home.php?key=$key&#39;>".$v['name']."</a>  ";		}else{			echo "<a target=&#39;_blank&#39; href=&#39;".$v[&#39;url&#39;]."home.php?key=$key&#39;>".$v['name']."</a>  ";		}    }}else{	echo "<script>alert('登陆失败!');history.go(-1);</script>";	exit();}function goback($refer){	header("Location:$refer");	exit();}function decode($string = '', $skey = 'lmj951753') {    $strArr = str_split(str_replace(array('O0O0O', 'o000o', 'oo00o'), array('=', '+', '/'), $string), 2);    $strCount = count($strArr);    foreach (str_split($skey) as $key => $value)        $key <= $strCount && $strArr[$key][1] === $value && $strArr[$key] = $strArr[$key][0];    return base64_decode(join(&#39;&#39;, $strArr));}function encode($string = &#39;&#39;, $skey = &#39;lmj951753&#39;) {    $strArr = str_split(base64_encode($string));    $strCount = count($strArr);    foreach (str_split($skey) as $key => $value)        $key < $strCount && $strArr[$key].=$value;    return str_replace(array(&#39;=&#39;, &#39;+&#39;, &#39;/&#39;), array(&#39;O0O0O&#39;, &#39;o000o&#39;, &#39;oo00o&#39;), join(&#39;&#39;, $strArr));}?>
ログイン後にコピー


サブサイトとしてのステーションの論理構造c はステーション a と同様ですが、ここでは列挙しません。PHP に基づく単純な SSO ログイン認証が完了します

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート