答網友問:虛擬團隊體制、制度實踐
Discuz有一個通行證,類似於單點登陸。不過我覺得單點登陸最好應該是一個獨立的程式,和CAS一樣。由於所有的程式都是PHP的,所以就做了一個簡單的單點登陸。借用了一下discuz的加密方法
使用者有以下幾種情況會直接訪問本系統
1 使用者直接訪問passport,希望登陸
2 使用者從passport_app上點選登陸按鈕轉過來的
3 使用者從passport_app1轉到passport_app2時候,passport_app2轉過來的
4 使用者直接輸入訪問passport_app的URL
2 3 4 或者有referer,或者有fromurl的引數
====
1 使用通行證的應用程式上面的登陸按鈕全部指向下面的連結
http://localhost/passport/login.php
2 如果使用者已經登陸了,轉到5
3 如果使用者還沒有登陸
轉到一個登陸頁面,要包含引數:
使用者名稱,密碼,fromurl(預處理過的refer)
提交到login.php?op=login
4 驗證通過以後,設定自身的session或者cookies,
5 根據使用者http頭裡面的refer得到來源地址。
5.1 如果沒有來源地址則顯示本passport登陸成功頁面,上面列出所有的passport應用
5.2 如果有refer,則跳回到refer的地址,即到6
6 轉到通行證應用的passport_login.php頁面,傳遞的引數包括
$userinfo 一個陣列,包含了使用者名稱,角色,組等其它資訊,一般不需要包含密碼
$fromurl
$verify md5($auth.$fromurl) 保證使用者資訊沒有被篡改
===============================
7 passport_login.php
首先檢查引數有沒有被改變
然後取出引數內的user_id
驗證通過以後,
如果user_id在系統記憶體不做處理
如果不存在,則根據編碼新增該使用者
最後設定自己的session/cookies,然後跳轉到fromurl
======
通行證的密匙,可以自行填寫英文,可包含任何字母及數字,長度大於 10 位元組
-------
程式碼如下
session_start();
$username = "";
$password = "";
$loginerror = "";
$fromurl = '';
if(isset($_GET['fromurl']) && trim($_GET['fromurl'])!= '') {
$fromurl = $_GET['fromurl'];
}else if(isset($_SERVER['HTTP_REFERER']) && trim($_SERVER['HTTP_REFERER'])!= '') {
$fromurl = $_SERVER['HTTP_REFERER'];
}
//防止同一個伺服器裝了多個upassport互相干擾
$key = md5(DB_DATABASE.DB_USER.DB_PASSWORD);
if(!isset($_SESSION['passport_app'])) {
unset($_SESSION['u']);
$_SESSION['passport_app'] = $key;
include('themes/'.THEME.'/login.html');
exit;
}else if($_SESSION['passport_app'] != $key) {
unset($_SESSION['u']);
$_SESSION['passport_app'] = $key;
include('themes/'.THEME.'/login.html');
exit;
}
if (isset($_POST['op'])&&trim($_POST['op'])=='dologin') {
$valid = 0;
$authnum = $_POST['authnum'];
$username = $_POST['username'];
$fromurl = $_POST['fromurl'];
if ($authnum && trim($_SESSION['authnum'])==$authnum && $username) {
$password = $_POST['password'];
$user = $db->getRow("select * from $dbutils->user where username = '$username' and password = '$password'");
if (!empty($user) && $user['user_id']!=0) {
$u['user_id'] = $user['user_id'];
$u['username'] = $user['username'];
$u['truename'] = $user['truename'];
$u['group'] = $db->getRow("select ug.group_id,g.group_name from $dbutils->user_group ug,$dbutils->group g where ug.group_id = g.group_id and ug.user_id = ".$user['user_id']);
$u['roles'] = $db->getAll("select ur.role_id,r.role_name,r.privileges from $dbutils->user_role ur,$dbutils->role r where ur.role_id = r.role_id and ur.user_id = ".$user['user_id']);
$privileges = Array();
foreach($u['roles'] as $role) {
$role_privis = explode(',',$role['privileges']);
foreach($role_privis as $p) {
if(!in_array($p,$privileges)) array_push($privileges,$p);
}
}
$u['privileges'] = $privileges ;
$_SESSION['u'] = $u;
$valid =1;
}
}
if (!$valid) {
$loginerror = '
$username = $_POST['username'];
unset($u);
}
}
//使用者正常跳轉或者訪問
$u = isset($_SESSION['u']) ? $_SESSION['u'] : '';
if (empty($u)) { //使用者不存在,跳到登陸介面
include('themes/'.THEME.'/login.html');
exit;
}else { //使用者存在,表示已經登陸過了
if(trim($fromurl)=='') { //沒有referer,則顯示預設主頁,列出所有應用
$t->assign('u',$u);
$t->render('index.html', "歡迎登陸通行證",'wrap.html',true);
}else { //從別的應用轉過來的,可能是上面 2 3 4,此時必有referer
//根據referer的url得到當前的應用的key和完整的地址
$passport_app = $db->GetRow("select * from $dbutils->app where INSTR('$fromurl', url)=1");
$userinfo = passport_encrypt(passport_encode($u), $passport_app['key']);
$verify = md5($userinfo.$fromurl.$passport_app['key']);
header("Location: ".$passport_app['login_url'].
"?userinfo=".rawurlencode($userinfo).
"&fromurl=".rawurlencode($fromurl).
"&verify=$verify");
}
}
客戶應用檢驗單點登陸的方法如下
$passport_key = '1234567890';
if($_GET['verify'] != md5($_GET['userinfo'].$_GET['fromurl'].$passport_key)) {
exit('Illegal request');
}
$u = array();
parse_str(passport_decrypt($_GET['userinfo'], $passport_key), $u);
header("location: ".$_GET['fromurl']);
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1653357
相關文章
- 網路時代的團隊:虛擬團隊(轉)
- 虛擬團隊
- 團隊開發中 Git 最佳實踐,不給隊友拖後腿Git
- 虛擬團隊與傳統團隊的差異思考(轉)
- OpenDoc – 前端團隊CodeReview制度前端View
- OpenDoc - 前端團隊CodeReview制度前端View
- Docker實踐(2)—虛擬網路Docker
- 構建你的虛擬團隊(轉)
- 客戶端爬取-答網友問客戶端
- CSS團隊精神:CSS最佳實踐團隊開發CSS
- [分享]我們團隊管理的最佳實踐——企業積分制度應該如何建立?
- 重新開博!近期專題——虛擬團隊管理
- 虛擬團隊成功的三步走(轉)
- CSS最佳實踐團隊開發CSS
- 虛擬團隊內部和外部的溝通風險
- 軟體工程,實踐作業1_團隊部落格軟體工程
- 【十問十答】對話Go語言開發團隊Go
- Facebook團隊關於網頁快取的再實踐網頁快取
- Java虛擬機器記憶體優化實踐Java虛擬機記憶體優化
- Linux問題:敏捷實踐如何幫助團隊更有效?Linux敏捷
- 聊聊SwiftLint在團隊的實踐Swift
- 測試團隊的組建實踐
- 【原創】答一位網友專案管理問題專案管理
- 虛擬伺服器管理實踐伺服器
- 虛擬主播技術在智慧問答中的應用
- 實體地址、虛擬地址
- AIX虛擬記憶體管理機制(轉)AI記憶體
- 將傳統遊戲融入虛擬現實,網友自制《中國象棋VR》創意爆棚遊戲VR
- 京東短網址高可用提升最佳實踐 | 京東雲技術團隊
- 研發團隊資源成本優化實踐優化
- 中小團隊基於Docker的devops實踐Dockerdev
- 團隊分享,Bem規範調研及實踐
- 記一次小團隊Git實踐(上)Git
- 記一次小團隊Git實踐(中)Git
- 記一次小團隊Git實踐(下)Git
- NLP實踐專案:智慧問答系統
- 答網友提問 - SAP Business Technology Platform(BTP) 的計費模式Platform模式
- 【江楓】AIX虛擬記憶體管理機制AI記憶體