1. 程式人生 > >php實現單點登入demo

php實現單點登入demo

1.準備兩個虛擬域名

127.0.0.1  www.openpoor.com

127.0.0.1  www.myspace.com

2.在openpoor的根目錄下建立以下檔案

index.PHP

[php] view plain copy
<?php  
session_start();  
  
?>  
<!DOCTYPE html>  
<html>  
<head>  
<meta charset="UTF-8"/>  
<title>sync login</title>  
</head>  
<body>  
  
<?php if(empty($_SESSION['username'])):?>  
hello,遊客;請先<a href="login.php">登入</a><a href="http://www.myspace.com/index.php">進入空間</a>  
<?php else: ?>  
hello,<?php echo $_SESSION['username']; ?>;<a href="http://www.myspace.com/index.php">進入空間</a>  
<?php endif; ?>  
  <a href="http://www.openpoor.com/index.php">home</a>  
</body>  
</html>  
login.php
<?php  
session_start();  
if(!empty($_POST['username'])){  
  require '../Des.php';  
  $_SESSION['username'] = $_POST['username'];  
  $redirect = 'http://www.openpoor.com/index.php';  
  header('Location:http://www.openpoor.com/sync.php?redirect='.urlencode($redirect).'&code='.Des::encrypt($_POST['username'],'openpoor'));exit;  
}  
?>  
<!DOCTYPE html>  
<html>  
<head>  
<meta charset="UTF-8"/>  
<title>sync login</title>  
</head>  
<body>  
<form action="" method="post">  
  <input type="text" name="username" placeholder="使用者名稱"/>  
  <input type="text" name="password" placeholder="密碼"/>  
  <input type="submit" value="登入"/>  
</form>  
</body>  
</html>  
sync.php
<?php  
$redirect = empty($_GET['redirect']) ? 'www.openpoor.com' : $_GET['redirect'];  
if(empty($_GET['code'])){    
  header('Loaction:http://'.urldecode($redirect));  
  exit;  
}  
  
$apps = array(  
  'www.myspace.com/slogin.php'  
);  
?>  
<!DOCTYPE html>  
<html>  
<head>  
<meta charset="UTF-8"/>  
<?php foreach($apps as $v): ?>  
<script type="text/javascript" src="http://<?php echo $v.'?code='.$_GET['code'] ?>"></script>  
<?php endforeach; ?>  
<title>passport</title>  
</head>  
<body>  
<script type="text/javascript">  
window.onload=function(){  
  location.replace('<?php echo $redirect; ?>');  
}  
</script>  
</body>  
</html>  
3.在myspace的根目錄下建立如下檔案

slogin檔案 完成session的設定

  1. <?php  
  2. session_start();  
  3. header('Content-Type:text/javascript; charset=utf-8');  
  4. if(!empty($_GET['code'])){  
  5.   require'../Des.php';  
  6.   $username = Des::decrypt($_GET['code'],'openpoor');  
  7.   if(!empty($username)){  
  8.     header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');  
  9.     $_SESSION['username'] = $username;  
  10.   }  
  11. }  
  12. ?>  
index.php
  1. <?php  
  2. session_start();  
  3. if(!empty($_SESSION['username']))  
  4. {  
  5.     echo"歡迎來到".$_SESSION['username']."的空間";  
  6. }else{  
  7.     echo"請先登入";  
  8. }  
  9. ?>  
4.Des.php的檔案內容如下
  1. <?php  
  2. /** 
  3.  *@see Yii CSecurityManager; 
  4.  */
  5. class Des{  
  6.   publicstaticfunction encrypt($data,$key){  
  7.       $module=mcrypt_module_open('des','', MCRYPT_MODE_CBC,'');  
  8.       $key=substr(md5($key),0,mcrypt_enc_get_key_size($module));  
  9.       srand();  
  10.       $iv=mcrypt_create_iv(mcrypt_enc_get_iv_size($module), MCRYPT_RAND);  
  11.       mcrypt_generic_init($module,$key,$iv);  
  12.       $encrypted=$iv.mcrypt_generic($module,$data);  
  13.       mcrypt_generic_deinit($module);  
  14.       mcrypt_module_close($module);  
  15.       return md5($data).'_'.base64_encode($encrypted);  
  16.   }  
  17.   publicstaticfunction decrypt($data,$key){      
  18.       $_data = explode('_',$data,2);  
  19.       if(count($_data)<2){  
  20.     return false;  
  21.       }  
  22.       $data = base64_decode($_data[1]);        
  23.       $module=mcrypt_module_open('des','', MCRYPT_MODE_CBC,'');  
  24.       $key=substr(md5($key),0,mcrypt_enc_get_key_size($module));  
  25.       $ivSize=mcrypt_enc_get_iv_size($module);  
  26.       $iv=substr($data,0,$ivSize);  
  27.       mcrypt_generic_init($module,$key,$iv);  
  28.       $decrypted=mdecrypt_generic($module,substr($data,$ivSize,strlen($data)));  
  29.       mcrypt_generic_deinit($module);  
  30.       mcrypt_module_close($module);  
  31.       $decrypted = rtrim($decrypted,"\0");         
  32.       if($_data[0]!=md5($decrypted)){  
  33.     return false;  
  34.       }  
  35.       return$decrypted;  
  36.   }  
  37. }  
  38. ?>  

當在openpoor登入後將session資訊傳到其他域名下的檔案下進行處理,以script標籤包含的形式進行執行。


5.此時訪問www.openpoor.com和www.myspace.com都是未登入狀態

登入後兩個域名下都是登入狀態

到此我們實現了一個簡單的單點登入。




相關推薦

php實現登入demo

1.準備兩個虛擬域名 127.0.0.1  www.openpoor.com 127.0.0.1  www.myspace.com 2.在openpoor的根目錄下建立以下檔案 index.PHP [php] view plain copy <?php

php實現登入

SSO即單點登入,是一種控制多個相關但彼此獨立的系統的訪問許可權, 擁有這一許可權的使用者可以使用單一的ID和密碼訪問某個或多個系統從而避免使用不同的使用者名稱或密碼,或者通過某種配置無縫地登入每個系統 。 對於大型系統來說使用單點登入可以減少使用者很多的麻煩。就拿百度來說吧,百度下面有很多的子

Windows 下Maven+Tomcat 8 使用JAVA以及 Json Web Token 實現 登入demo

0.準備工作 如果你本地環境都OK,可以跳過。 1.簡介 json web token(JWT)是一種新的使用者認證方式,不同與以前的Session. JWT不需要伺服器端儲存使用者資訊,當用戶登入後,伺服器將使用者資訊放入加密放入t

使用php實現登錄實例詳解

標簽 ati 準備 mys creat tar pub sao img 1.首先準備兩個虛擬域名 127.0.0.1 www.openpoor.com 127.0.0.1 www.myspace.com 2.在openpoor的根目錄下創建以下文件 index.

PCB CS架構(工程系統)實現登入方法

社會的不斷進步發展,分工也越來越細了.而我們工作接觸的範圍也越來越狹小了,但這不是倒退了,而是分工之細讓人們在各個方面深耕細作。PCB企業軟體系統發展路線同樣也如此,隨著我們PCB企業發展不斷壯大,軟體系統也在不斷細分。目的只有一個,讓專業的事情交給專業的系統去做。回想當初起公司用必有德ERP,一個ERP能搞

Spring Boot WebSocket 節點模擬實現登入擠退

1、建立WebSocketServer @ServerEndpoint("/websocket/{sid}") @Component  // 成分、元件 public class WebSocketServer {     //靜態變數,用來記錄當前線上

Java Redis + Cookie + Filter 實現登入

Java Redis + Cookie + Filter 實現單點登入 Java Redis + Cookie + Filter 實現單點登入 1 緣起 2 大體思路 3 擼起袖子幹 3

Springboot 使用Redis+Session實現Session共享 , 實現登入

話說在前:   在你開啟我的這篇東西的時候,你應該學會了基於springboot專案使用Redis了,因為我不會在這篇過多去介紹·從redis基本配置。 然後, 你如果登入這模組,使用了shiro 或者說是 security ,沒關係的。 我也是結合shiro一起使用的。

Shiro結合JWT實現登入

簡述 Apache Shiro是java的一個安全框架,Shiro可以幫助我們完成認證、授權、加密、會話管理、與Web整合、快取等。而且Shiro的API也比較簡單,這裡我們就不進行過多的贅述,想要詳細瞭解Shiro的,推薦看開濤的部落格(點這裡) 在Shiro的強大許可

CAS實現登入(SSO)

什麼是單點登入 單點登入(Single Sign On),簡稱為 SSO,是目前比較流行的企業業務整合的解決方案之一。SSO的定義是在多個應用系統中,使用者只需要登入一次就可以訪問所有相互信任的應用系統。 我們目前的系統存在諸多子系統,而這些子系統是分別部署在不

CAS實現登入SSO執行原理探究(終於明白了)

一、不落俗套的開始 1、背景介紹 單點登入:Single Sign On,簡稱SSO,SSO使得在多個應用系統中,使用者只需要登入一次就可以訪問所有相互信任的應用系統。 CAS框架:CAS(Central Authentication Service)是實現S

spring boot中spring security實現登入,傳統模式(一)

單點登入是什麼? 一個系統中可能會引用別的很多系統。單點登入就是解決,一次登入,就可以訪問所有的系統。 每次瀏覽器向一個域名傳送http請求,會去查詢域名的cookie資訊拼接到http的header中傳送到伺服器。 cookie不能跨域。這個域是瀏覽器請求的域名,哪怕他們都是訪問一

CAS實現登入(sso)搭建流程 伺服器端搭建

一、簡介 1、cas是有耶魯大學研發的單點登入伺服器 2、所用環境 ·        Linux系統 ·        To

Tomcat叢集環境下實現登入

一、問題分析 在tomcat叢集環境下,session是不能在tomcat之間共享的,所以會導致如下問題,如圖所示: 通一個瀏覽器傳送多次請求,請求可能會被nginx轉發到不同的tomcat上,因為session不能共享,可能會導致登入成功後,發起其他的請求,返回給使用者的依舊

springboot+security+JWT實現登入

  本次整合實現的目標:1、SSO單點登入2、基於角色和spring security註解的許可權控制。   整合過程如下:   1、使用maven構建專案,加入先關依賴,pom.xml如下: <?xml version="1.0" encoding="UTF-8"?> <project

cas實現登入-應用場景和完整配置

Cas 簡介 1、什麼是CAS CAS是一個單點登入(SSO)的框架。單點登入是目前比較流行的服務於企業業務整合的解決方案之一,SSO使得在多個應用系統中,使用者只需要登入一次就可以訪問所有相互信任的應用系統。 2、CAS的主要結構 CAS包括兩部分:

CAS 實現登入oos(2)

  前面已經介紹了CAS伺服器的搭建,詳情見:搭建CAS單點登入伺服器。然而前面只是簡單地介紹了伺服器的搭建,其驗證方式是原始的配置檔案的方式,這顯然不能滿足日常的需求。下面介紹下通過mysql資料庫認證的方式。   一、CAS認證之mysql資料庫認證   1、在mysql中新建一個cas資料庫並建立us

spring boot整合Shiro實現登入

前面的部落格中,我們說道了Shiro的兩個最大的特點,認證和授權,而單點登入也是屬於認證的一部分,預設情況下,Shiro已經為我們實現了和Cas的整合,我們加入整合的一些配置就ok了。 1、加入shiro-cas包 <!-- shiro整合cas單點 -->

Redis+Cookie+Jackson+Filter實現登入

1.Redis連線池構建 首先maven匯入依賴包 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId>

關於redis實現登入的一點思路

先簡單說一下單點登入: 把登入的部分單獨拿出來作為一個專案,專門用來登入。 當我想訪問某個子專案或者模組的時候,會先請求登入的部分,如果登入過了,就不需要再登入了。 這個和單獨專案時,把userId放到session中道理是一樣的。 因為多個子專案在不同的tomcat,無法