我對Zend Auth有所擔憂。我在互聯網上搜索過,但沒有找到任何教程,文章或討論;Zend AUTH在差異計算機或瀏覽器上禁用多次登錄
方案:同時在'COMPUTER 01'和'COMPUTER 02'上以'ADMIN'登錄。
我想讓我的用戶登錄系統阻止'ADMIN'用戶同時登錄兩臺計算機。因此,當用戶已經登錄時,系統將禁用其他機器上的登錄。
我對Zend Auth有所擔憂。我在互聯網上搜索過,但沒有找到任何教程,文章或討論;Zend AUTH在差異計算機或瀏覽器上禁用多次登錄
方案:同時在'COMPUTER 01'和'COMPUTER 02'上以'ADMIN'登錄。
我想讓我的用戶登錄系統阻止'ADMIN'用戶同時登錄兩臺計算機。因此,當用戶已經登錄時,系統將禁用其他機器上的登錄。
你可能會需要跟蹤會話的數據庫中,通過改變會話處理程序:
http://framework.zend.com/manual/en/zend.session.savehandler.dbtable.html
從那裏,你將要編寫自定義Zend_Auth的適配器,檢查會話表主動登錄該帳戶並在已有活動登錄時返回false。
http://framework.zend.com/manual/en/zend.auth.introduction.html
據我所知,這個功能不是內置於Zend_Auth
,但你可以達到你想要什麼由你正在使用擴展Zend_Auth_Adapter
和overiding的authenticate()
方法danielrsmith建議。
您需要向登錄過程中設置/取消設置的數據庫添加一個表。如果用戶沒有特別註銷,問題將會被解除,但是您可以在數據庫中存儲時間戳,並允許登錄到下一次登錄嘗試。
My_Auth_Adapter_DbTable extends Zend_Auth_Adapter_DbTable
{
public function authenticate()
{
$authResult = parent::authenticate();
if($this->alreadyLoggedIn(){
$authResult = new Zend_Auth_Result(
Zend_Auth_Result::FAILURE_UNCATEGORIZED,
$this->_identity,
array('User already logged in')
);
} else {
$this->setLoggedIn();
}
return $authResult;
}
private function alreadyLoggedIn()
{
//check db table to see if $this->_identity is already logged in
//then return true or false as appropriate
}
private function setLoggedIn()
{
//update table in DB to reflect logged in status
}
}
我還沒有測試此代碼,但它會,希望讓你在正確的方向開始。 此外,我認爲這樣做會避免以任何方式改變會話處理器。
試試這個:
在數據庫中創建會話表:
CREATE TABLE session
( id
CHAR(32), modified
INT, lifetime
INT, data
文本, PRIMARY KEY (id
) );
通過Zend_Session_SaveHandler_DbTable在數據庫中存儲會話。把下面的代碼在bootstrap.php中
protected function _initDoctrineSession()
{$ URL =常數( 「APPLICATION_PATH」)。DIRECTORY_SEPARATOR。 「CONFIGS」 .DIRECTORY_SEPARATOR。「應用程序。INI 「; $配置=新Zend_Config_Ini的($網址,」 MySQL的「); $ DB = Zend_Db的工廠::(組$ config->分貝);
Zend_Db_Table_Abstract::setDefaultAdapter($db);
$config = array(
'name' => 'session',
'primary' => 'id',
'modifiedColumn' => 'modified',
'dataColumn' => 'data',
'lifetimeColumn' => 'lifetime'
);
Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_DbTable($config));
Zend_Session::start();
}
當日志,保存用戶ID或用戶名在會話:
$logged_user = new Zend_Session_Namespace('logged_user');
$logged_user->logged_user = $user->name;
另一個日誌中刪除所有過期會話數據庫首先:
$sessionModel = new Session();
$sessionModel->removeExpiredSessions();
畫完登錄,搜索會話表記錄,看看是否當前用戶已經登錄:
$sessions = $sessionModel->querySessions();
$flag=true;
foreach ($sessions as $session){
if(strpos($session['data'], $user->name)>0 and strpos($session['data'],"Zend_Auth")>0
){
$flag=false;
}
}
if($flag == false){
$this->_forward('index','index');
return;
}
這將工作。但是有一個問題,如果用戶在註銷之前關閉Web瀏覽器,用戶將無法在會話過期之前再次登錄。任何人都可以幫助解決最後一個問題?
您在此網站上提出了四個問題,但尚未接受答案。如果你想讓這裏的人來幫助你,也許你會想要解決這個問題。 – vascowhite