>백엔드 개발 >PHP 튜토리얼 >php透过统一发放tickets实现单点登陆SSO功能

php透过统一发放tickets实现单点登陆SSO功能

WBOY
WBOY원래의
2016-06-13 12:19:131227검색

php通过统一发放tickets实现单点登陆SSO功能

站点a,站点b,站点c,分别跨域,站点b当做统一认证中心,站点a,站点c登录请求转发到站点b,站点b当做统一登录,注册中心,也称第三方身份认证中心;用户从不同站点登录到第三方认证中心,完成登录验证后,会生成一个包含用户登录信息的加密key,并且生成多个不同子应用的带加密key的引导页面,用户可以自由选择进入子应用引导页,完成子页面认证,从而无需分别登录子应用的登陆入口了,看效果:


通过a站点登录,登录成功后进入第三方登录引导界面:


通过按钮,附加统一的key,进入a站引导中心



通过按钮,附加统一的key,进入c站引导中心




已经实现b站点代理登陆,实现a,c站点登陆了,只要b中心,添加多个子站点列表,就可以实现一个登录,注册中心,一个key实现所有子应用自动登陆,替代了传统子应用单独登陆的问题,简化了用户操作流程!


公共函数

<?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."';";	}}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  $value)        $key 


a站登录入口:

	<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">	<title>a站点</title>	<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="'btn'" value="登陆"></p>		</form>	</div>


a站引导页:

<?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();}?>	<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">	<title>登陆引导中心</title>	<p>欢迎回来!这里是A站点<?php echo $_SESSION[&#39;username&#39;] ?></p>	<p><a href="'http://www.a.com/admin.php'">管理中心		</a>  <a href="'http://www.a.com/logout.php'">退出</a>	</p>

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="'_blank'" style="'color:red;font-weight:bold'" href="'%22.%24v%5B'url'%5D.%22home.php?key=%24key'">".$v['name']."</a>  ";		}else{			echo "<a target="'_blank'" href="'%22.%24v%5B'url'%5D.%22home.php?key=%24key'">".$v['name']."</a>  ";		}    }}else{	echo "<script>alert(&#39;登陆失败!&#39;);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  $value)        $key 


c站作为子站点和a站逻辑结构差不多,就不列举了,一个简单的基于php实现的sso登陆认证就完成了

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