Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Einführung in die PHP-Programmierung von SSO und einfache Beispiele

Detaillierte Einführung in die PHP-Programmierung von SSO und einfache Beispiele

高洛峰
高洛峰Original
2017-01-17 14:11:521568Durchsuche

Detaillierte Erklärung von PHP SSO

SSO verfügt über drei Modi: ①Subdomänenübergreifende Einzelpunktanmeldung ②Vollständige Einzelpunktdomänenanmeldung ③Gemeinsame Identitätsauthentifizierung der Stationsgruppe

Der erste Modus ist sehr einfach. Sie müssen lediglich die Cookie-Domäne auf die Stammdomäne mehrerer Anwendungen festlegen. Die zweite Methode ist ebenfalls sehr einfach und besteht darin, die Authentifizierungsadressen aller Anwendungen jedes Mal durch dieselbe Authentifizierungsadresse zu ersetzen . Überprüfen Sie, ob Sie im Zertifizierungszentrum angemeldet sind, und stellen Sie der aufrufenden Anwendung ein verschlüsseltes Token aus.

Die dritte Art der domänenübergreifenden Nutzung ist etwas mühsam Springen Sie hin und her, um das Token zu überprüfen

Verzeichnisstruktur konfigurieren

Erstellen Sie im Stammverzeichnis des Servers drei neue Projektverzeichnisse:

|–/Website-Stammverzeichnis/

|–|–/oa/

|. –|–/bbs/

|–|–/blog/

Erstellen Sie eine neue Skriptdatei „functions.PHP“ im Stammverzeichnis lautet wie folgt:

Im oa-Projektverzeichnis erstellen Sie als Nächstes zwei Skriptdateien, index.php und login.php

<?php
 
/**
 * 获取登陆token
 * @param string $url 获取token的地址
 * 2017-01-03T13:08:43+0800
 */
function getToken($url)
{
  $bool = isLogin();
  if ($bool) {
    // 如果登陆了跳转到本站首页
    header(&#39;location: index.php&#39;);
    exit();
  }
 
  // 否则没有登陆,去另一个站点看是否登陆
  header(&#39;location: &#39;.$url);
}
 
// 校验令牌是否正确
function yzToken($domain)
{
  $url = isset($_GET[&#39;url&#39;]) ? $_GET[&#39;url&#39;] : &#39;&#39;;
  $username = isset($_GET[&#39;username&#39;]) ? $_GET[&#39;username&#39;] : &#39;&#39;;
  $token = isset($_GET[&#39;token&#39;]) ? $_GET[&#39;token&#39;] : &#39;&#39;;
 
 
  if (!empty($username) && !empty($token)) {
    $salt = &#39;taoip&#39;;
    $_token = md5($salt.$username);
    // 校验第三方站点过来时的token是否正确
    if ($_token == $token) {
      // 设置跳转过来的网站的Cookie
      setCook($username, $_token, $domain);
      header(&#39;location: index.php&#39;);
    }
  }
 
}
 
// 设置cookie
function setCook($username, $_password, $domain)
{
  // 校验成功,开始登陆
  setcookie(&#39;username&#39;, $username, time()+3600, &#39;/&#39;, $domain);
  setcookie(&#39;token&#39;, $_password, time()+3600, &#39;/&#39;, $domain);
  header(&#39;location: index.php&#39;);
}
 
// 判断是否登陆
function isLogin()
{
  $username = isset($_COOKIE[&#39;username&#39;]) ? $_COOKIE[&#39;username&#39;] : &#39;&#39;;
  $token = isset($_COOKIE[&#39;token&#39;]) ? $_COOKIE[&#39;token&#39;] : &#39;&#39;;
  $salt = &#39;taoip&#39;;
 
  $_token = md5($salt.$username);
 
  if ($token == $_token) {
    return true;
  } else {
    return false;
  }
}
 
?>
Bearbeiten Sie die Datei index.php

Bearbeiten Sie die Datei login.php

<?php
 
// OA站点
 
// (1)开启Session会话
session_name(&#39;taoip&#39;);
session_start();
// (2)获取用户名和token进行校验
$username = isset($_COOKIE[&#39;username&#39;]) ? $_COOKIE[&#39;username&#39;] : &#39;&#39;;
$token = isset($_COOKIE[&#39;token&#39;]) ? $_COOKIE[&#39;token&#39;] : &#39;&#39;;
 
$salt = &#39;taoip&#39;;
 
$_token = md5($salt.$username);
 
if ($token != $_token) {
  header(&#39;location: login.php&#39;);
  exit();
}
 
echo "欢迎{$username}用户,访问OA站点";
 
?>

in bbs. Erstellen Sie im Projektverzeichnis zwei Skriptdateien, index.php und login.php

<?php
 
// OA站点登陆系统
require &#39;../functions.php&#39;;
 
// (2)验证
yzToken(&#39;taoip.cn&#39;);
 
// (1)判断是否登陆,登陆则跳转首页,未登录则去其他站点获取token
$url = isset($_GET[&#39;url&#39;]) ? $_GET[&#39;url&#39;] : &#39;&#39;;
if (empty($url)) {
  getToken(&#39;http://dengpeng.cc/login.php?url=http://oa.taoip.cn/login.php&#39;);
}
 
// (1)判断用户是否登陆
$bool = isLogin();
$url = isset($_GET[&#39;url&#39;]) ? $_GET[&#39;url&#39;] : &#39;&#39;;
if ($bool) {
  if (empty($url)) {
    header(&#39;location: index.php&#39;);
  } else {
    $username = isset($_COOKIE[&#39;username&#39;]) ? $_COOKIE[&#39;username&#39;] : &#39;&#39;;
    $token = isset($_COOKIE[&#39;token&#39;]) ? $_COOKIE[&#39;token&#39;] : &#39;&#39;;
    $lurl = $url.&#39;?username=&#39;.$username.&#39;&token=&#39;.$token;
    header(&#39;location: &#39;.$lurl);
  }
}
 
 
if (!empty($_POST)) {
  $username = isset($_POST[&#39;username&#39;]) ? $_POST[&#39;username&#39;] : &#39;&#39;;
  $password = isset($_POST[&#39;password&#39;]) ? $_POST[&#39;password&#39;] : &#39;&#39;;
 
  // 从库中查询用户密码
  @$link = mysql_connect(&#39;localhost&#39;, &#39;root&#39;, &#39;&#39;);
  mysql_query(&#39;use sso&#39;, $link);
  mysql_query(&#39;set names utf8&#39;, $link);
  $sql = "select * from users where username = &#39;".$username."&#39;";
  $user = mysql_fetch_assoc(mysql_query($sql, $link));
 
  // 校验
  $salt = &#39;taoip&#39;;
  $_password = md5($salt.$username);
 
  // var_dump($user[&#39;password&#39;] == $_password);
  // print_r($user);exit();
 
  if ($user[&#39;password&#39;] == $_password) {
    // 校验成功,开始登陆
    setcookie(&#39;username&#39;, $username, time()+3600, &#39;/&#39;, &#39;taoip.cn&#39;);
    setcookie(&#39;token&#39;, $_password, time()+3600, &#39;/&#39;, &#39;taoip.cn&#39;);
    // 如果URL没有值重定向到首页,否则重定向到URL页面
    if (empty($url)) {
      header(&#39;location: index.php&#39;);
    } else {
      header(&#39;location: &#39;.$lurl);
    }
  }
}
 
?>
 
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta name="generator" content="Sublime Text 3114">
  <meta name="author" content="3@dengpeng.cc">
  <meta name="keywords" content="">
  <meta name="description" content="">
  <title>OA站点登陆系统</title>
</head>
<body>
  <p>
    <h2>oa.taoip.cn站点登陆系统</h2>
    <form action="" method="post">
      <label for="">用户名</label>
      <input type="text" name="username">
      <br>
      <label for="">密码</label>
      <input type="text" name="password">
      <hr>
      <button type="submit">提交</button>
    </form>
  </p>
</body>
</html>
Bearbeiten Sie die Datei index.php

Bearbeiten Sie die Datei login.php

<?php
/**
 * @author DengPeng <3@dengpeng.cc>
 * @since 2017/01/03
 * @copyright copyright (c) 2017 zixue.it GPL
 * @license http://www.zixue.it/
 */
 
// BBS站点
 
// (1)开启Session会话
session_name(&#39;taoip&#39;);
session_start();
// (2)获取用户名和token进行校验
$username = isset($_COOKIE[&#39;username&#39;]) ? $_COOKIE[&#39;username&#39;] : &#39;&#39;;
$token = isset($_COOKIE[&#39;token&#39;]) ? $_COOKIE[&#39;token&#39;] : &#39;&#39;;
 
$salt = &#39;taoip&#39;;
 
$_token = md5($salt.$username);
 
if ($token != $_token) {
  header(&#39;location: login.php&#39;);
  exit();
}
 
echo "欢迎{$username}用户,访问BBS站点";
 
?>

Erstellen Sie im Blog-Projektverzeichnis zwei Skriptdateien, index.php und login.php

<?php
/**
 * @author DengPeng <3@dengpeng.cc>
 * @since 2017/01/03
 * @copyright copyright (c) 2017 zixue.it GPL
 * @license http://www.zixue.it/
 */
 
// BBS站点登陆系统
require &#39;../functions.php&#39;;
 
// (2)验证
yzToken(&#39;taoip.cn&#39;);
 
// (1)判断是否登陆,登陆则跳转首页,未登录则去其他站点获取token
$url = isset($_GET[&#39;url&#39;]) ? $_GET[&#39;url&#39;] : &#39;&#39;;
if (empty($url)) {
  getToken(&#39;http://dengpeng.cc/login.php?url=http://bbs.taoip.cn/login.php&#39;);
}
 
// (1)判断用户是否登陆
$bool = isLogin();
$url = isset($_GET[&#39;url&#39;]) ? $_GET[&#39;url&#39;] : &#39;&#39;;
if ($bool) {
  if (empty($url)) {
    header(&#39;location: index.php&#39;);
  } else {
    $username = isset($_COOKIE[&#39;username&#39;]) ? $_COOKIE[&#39;username&#39;] : &#39;&#39;;
    $token = isset($_COOKIE[&#39;token&#39;]) ? $_COOKIE[&#39;token&#39;] : &#39;&#39;;
    $lurl = $url.&#39;?username=&#39;.$username.&#39;&token=&#39;.$token;
    header(&#39;location: &#39;.$lurl);
  }
}
 
 
if (!empty($_POST)) {
  $username = isset($_POST[&#39;username&#39;]) ? $_POST[&#39;username&#39;] : &#39;&#39;;
  $password = isset($_POST[&#39;password&#39;]) ? $_POST[&#39;password&#39;] : &#39;&#39;;
 
  // 从库中查询用户密码
  @$link = mysql_connect(&#39;localhost&#39;, &#39;root&#39;, &#39;&#39;);
  mysql_query(&#39;use sso&#39;, $link);
  mysql_query(&#39;set names utf8&#39;, $link);
  $sql = "select * from users where username = &#39;".$username."&#39;";
  $user = mysql_fetch_assoc(mysql_query($sql, $link));
 
  // 校验
  $salt = &#39;taoip&#39;;
  $_password = md5($salt.$username);
 
  // var_dump($user[&#39;password&#39;] == $_password);
  // print_r($user);exit();
 
  if ($user[&#39;password&#39;] == $_password) {
    // 校验成功,开始登陆
    setcookie(&#39;username&#39;, $username, time()+3600, &#39;/&#39;, &#39;taoip.cn&#39;);
    setcookie(&#39;token&#39;, $_password, time()+3600, &#39;/&#39;, &#39;taoip.cn&#39;);
    // 如果URL没有值重定向到首页,否则重定向到URL页面
    if (empty($url)) {
      header(&#39;location: index.php&#39;);
    } else {
      header(&#39;location: &#39;.$lurl);
    }
  }
}
 
?>
 
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta name="generator" content="Sublime Text 3114">
  <meta name="author" content="3@dengpeng.cc">
  <meta name="keywords" content="">
  <meta name="description" content="">
  <title>BBS站点登陆系统</title>
</head>
<body>
  <p>
    <h2>bbs.taoip.cn站点登陆系统</h2>
    <form action="" method="post">
      <label for="">用户名</label>
      <input type="text" name="username">
      <br>
      <label for="">密码</label>
      <input type="text" name="password">
      <hr>
      <button type="submit">提交</button>
    </form>
  </p>
</body>
</html>
Bearbeiten Sie den Index .php-Datei

Bearbeiten Sie die login.php-Datei

<?php
/**
 * @author DengPeng <3@dengpeng.cc>
 * @since 2017/01/03
 * @copyright copyright (c) 2017 zixue.it GPL
 * @license http://www.zixue.it/
 */
 
// blog站点
 
// (1)开启Session会话
session_name(&#39;taoip&#39;);
session_start();
// (2)获取用户名和token进行校验
$username = isset($_COOKIE[&#39;username&#39;]) ? $_COOKIE[&#39;username&#39;] : &#39;&#39;;
$token = isset($_COOKIE[&#39;token&#39;]) ? $_COOKIE[&#39;token&#39;] : &#39;&#39;;
 
$salt = &#39;taoip&#39;;
 
$_token = md5($salt.$username);
 
if ($token != $_token) {
  header(&#39;location: login.php&#39;);
  exit();
}
 
echo "欢迎{$username}用户,访问blog站点";
 
?>
 
<?php
/**
 * @author DengPeng <3@dengpeng.cc>
 * @since 2017/01/03
 * @copyright copyright (c) 2017 zixue.it GPL
 * @license http://www.zixue.it/
 */
 
// blog站点
 
// (1)开启Session会话
session_name(&#39;taoip&#39;);
session_start();
// (2)获取用户名和token进行校验
$username = isset($_COOKIE[&#39;username&#39;]) ? $_COOKIE[&#39;username&#39;] : &#39;&#39;;
$token = isset($_COOKIE[&#39;token&#39;]) ? $_COOKIE[&#39;token&#39;] : &#39;&#39;;
 
$salt = &#39;taoip&#39;;
 
$_token = md5($salt.$username);
 
if ($token != $_token) {
  header(&#39;location: login.php&#39;);
  exit();
}
 
echo "欢迎{$username}用户,访问blog站点";
 
?>

Konfigurieren Sie den lokalen virtuellen Host

<?php
/**
 * @author DengPeng <3@dengpeng.cc>
 * @since 2017/01/03
 * @copyright copyright (c) 2017 zixue.it GPL
 * @license http://www.zixue.it/
 */
 
// blog站点登陆系统
require &#39;../functions.php&#39;;
 
// (2)验证
yzToken(&#39;dengpeng.cc&#39;);
 
// (1)判断是否登陆,登陆则跳转首页,未登录则去其他站点获取token
$url = isset($_GET[&#39;url&#39;]) ? $_GET[&#39;url&#39;] : &#39;&#39;;
if (empty($url)) {
  getToken(&#39;http://oa.taoip.cn/login.php?url=http://dengpeng.cc/login.php&#39;);
}
 
 
// (1)判断用户是否登陆
$bool = isLogin();
$url = isset($_GET[&#39;url&#39;]) ? $_GET[&#39;url&#39;] : &#39;&#39;;
if ($bool) {
  if (empty($url)) {
    header(&#39;location: index.php&#39;);
  } else {
    $username = isset($_COOKIE[&#39;username&#39;]) ? $_COOKIE[&#39;username&#39;] : &#39;&#39;;
    $token = isset($_COOKIE[&#39;token&#39;]) ? $_COOKIE[&#39;token&#39;] : &#39;&#39;;
    $lurl = $url.&#39;?username=&#39;.$username.&#39;&token=&#39;.$token;
    header(&#39;location: &#39;.$lurl);
  }
}
 
 
// (3)判断用户是否提交数据
if (!empty($_POST)) {
  $username = isset($_POST[&#39;username&#39;]) ? $_POST[&#39;username&#39;] : &#39;&#39;;
  $password = isset($_POST[&#39;password&#39;]) ? $_POST[&#39;password&#39;] : &#39;&#39;;
 
  // 从库中查询用户密码
  @$link = mysql_connect(&#39;localhost&#39;, &#39;root&#39;, &#39;&#39;);
  mysql_query(&#39;use sso&#39;, $link);
  mysql_query(&#39;set names utf8&#39;, $link);
  $sql = "select * from users where username = &#39;".$username."&#39;";
  $user = mysql_fetch_assoc(mysql_query($sql, $link));
 
  // 校验
  $salt = &#39;taoip&#39;;
  $_password = md5($salt.$username);
 
  // var_dump($user[&#39;password&#39;] == $_password);
  // print_r($user);exit();
 
  if ($user[&#39;password&#39;] == $_password) {
    setCook($username, $_password, &#39;dengpeng.cc&#39;);
    if (empty($url)) {
      header(&#39;location: index.php&#39;);
    } else {
      header(&#39;location: &#39;.$lurl);
    }
  }
}
 
?>
 
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta name="generator" content="Sublime Text 3114">
  <meta name="author" content="3@dengpeng.cc">
  <meta name="keywords" content="">
  <meta name="description" content="">
  <title>blog站点登陆系统</title>
</head>
<body>
  <p>
    <h2>dengpeng.cc站点登陆系统</h2>
    <form action="" method="post">
      <label for="">用户名</label>
      <input type="text" name="username">
      <br>
      <label for="">密码</label>
      <input type="text" name="password">
      <hr>
      <button type="submit">提交</button>
    </form>
  </p>
</body>
</html>
Ich denke, jeder sollte die spezifischen Konfigurationsschritte kennen, deshalb tue ich es nicht Sie müssen nicht einzeln auf die Details eingehen. Sie müssen nur der von mir angegebenen Referenz folgen und die Zuordnung zu den Verzeichnissen konfigurieren, die den verschiedenen Domänennamen entsprechen. taoip.cn /oa/

bbs.taoip.cn /bbs/

dengpeng.cc /blog/

Herzlichen Glückwunsch, Sie haben ein einfaches SSO-System fertiggestellt

Denken Sie nach Abschluss der Konfiguration daran, den Webserver neu zu starten. Dann müssen Sie nur diese drei verschiedenen Sites besuchen, um sich bei einer Site anzumelden, und es werden keine anderen Sites angemeldet. Senden Sie eine Anmeldeanfrage Vielen Dank fürs Lesen, ich hoffe, es kann allen helfen, vielen Dank für Ihre Unterstützung dieser Website!

Weitere Artikel zur PHP-Programmierung SSO, ausführliche Einführung und einfache Beispiele finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn