>  기사  >  백엔드 개발  >  PHP 프로그래밍 SSO 자세한 소개 및 예

PHP 프로그래밍 SSO 자세한 소개 및 예

墨辰丷
墨辰丷원래의
2018-05-26 15:27:421571검색

이 글에서는 주로 PHP 프로그래밍 SSO에 대한 자세한 소개와 간단한 예의 관련 정보를 소개합니다. 여기에서는 하위 도메인 간 단일 로그인, 완전한 교차 단일 포인트 도메인 로그인 및 스테이션 그룹 공유 ID의 세 가지 모드를 소개합니다. 다음

PHP SSO 자세한 설명

SSO에는 세 가지 모드가 있습니다. ①교차 하위 도메인 단일 포인트 로그인 ②교차 단일 포인트 도메인 로그인 완료 ③스테이션 그룹 공유 ID 인증

첫 번째 모드는 매우 간단합니다. 쿠키 도메인을 여러 애플리케이션의 루트 도메인으로 설정하기만 하면 됩니다

두 번째 방법도 매우 간단합니다. 모든 애플리케이션의 인증 주소를 동일한 인증 주소로 변경하고 확인하는 것입니다. 매번 인증센터에서 로그인을 하든, 로그인 후 호출하는 애플리케이션에 암호화된 토큰을 발급하면 됩니다

세 번째 유형의 크로스 도메인은 토큰을 확인하기 위해 왔다 갔다 하는 방식인데 조금 번거롭습니다.

디렉터리 구조 구성

서버 루트 디렉터리에서 세 개의 새 디렉터리를 만듭니다. 프로젝트 디렉터리:

|–/website root 디렉터리/
|–|–/oa/
|–|–/bbs/
| –|–/blog/

루트 디렉터리에 새 function.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;
  }
}

?>

oa 프로젝트 디렉터리에 index.php와 두 개의 스크립트 파일을 생성합니다. login.php

index.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站点";

?>

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 lang="en">
<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 class="container">
    <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>

bbs 프로젝트 디렉토리에 index.php와 login.php라는 두 개의 스크립트 파일을 생성하세요

index.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站点";

?>

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 lang="en">
<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 class="container">
    <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>

블로그에서 프로젝트 디렉터리에 index.php와 login.php라는 두 개의 스크립트 파일을 만듭니다

편집 index.php 파일

<?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站点";

?>

login.php 파일 편집

<?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 lang="en">
<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 class="container">
    <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>

로컬 가상 호스트 구성

모든 사람이 구체적인 구성 단계를 숙지해야 한다고 생각하므로 생략하겠습니다. 세부 사항을 하나씩 살펴보고, 다른 도메인 이름에 해당하는 디렉터리를 구성하고 매핑하면 됩니다.

oa.taoip. taoip.cn /bbs/

dengpeng.cc /blog/


축하합니다. 간단한 SSO 시스템을 완성했습니다

구성이 완료되면 웹 서버를 다시 시작해야 합니다. 그런 다음 이 세 가지 사이트에 액세스하기만 하면 됩니다. 하나의 사이트에 로그인하는 데 사용할 수 있으며 다른 사이트에서는 더 이상 로그인 요청을 보내지 않습니다.

위 내용은 이 글의 전체 내용이므로 모든 분들의 학습에 도움이 되기를 바랍니다.

관련 권장 사항:

PHP Single Sign-On SSO 구현 방법


SSO Single Sign-On 원리를 설명하는 예


php는 두 개의 사용자 정의 키 이름 비교 함수를 사용합니다 array_udiff_ua

c()

위 내용은 PHP 프로그래밍 SSO 자세한 소개 및 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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