这很简单.我写
$auth->getStorage()->write($user);
Run Code Online (Sandbox Code Playgroud)
然后我想,在一个单独的进程中加载这个$ user,但我不能因为
$user = $auth->getIdentity();
Run Code Online (Sandbox Code Playgroud)
是空的.我不是只是......设定它?为什么不起作用?HALP?
[编辑2011-04-13]
大约两年前就有人问过这个问题.但事实是,我在2010年7月重复了这个问题并得到了一个很棒的答案,我当时根本就不明白.
我已经构建了一个非常好的litte类,我使用与Zend_Auth相同的存储引擎在所有项目中使用(有时需要额外调整),但是避免了所有不好的事情.
<?php
class Qapacity_Helpers_Storage {
public function save($name = 'default', $data) {
$session = new Zend_Session_Namespace($name);
$session->data = $data;
return true;
}
public function load($name = 'default', $part = null) {
$session = new Zend_Session_Namespace($name);
if (!isset($session->data))
return null;
$data = $session->data;
if ($part && isset($data[$part]))
return $data[$part];
return $data;
}
public function clear($name = 'default') {
$session = new Zend_Session_Namespace($name);
if (isset($session->data))
unset($session->data);
return true;
}
} …Run Code Online (Sandbox Code Playgroud) 我试过用:
// do login if request is posted
if (isset($_POST) && !empty($_POST)) {
// do authencation
...
} else {
// request not posted
// see if already logged in
if (Zend_Auth::getInstance()->hasIdentity()) {
echo "already logged in as: " . Zend_Auth::getInstance()->getIdentity();
}
}
Run Code Online (Sandbox Code Playgroud)
Zend_Auth::getInstance()->hasIdentity() 似乎总是假的......即使登录后也是如此
目前,我正在定期DbTable Auth Adapter:
protected function _getAuthAdapter($formData)
{
$dbAdapter = Zend_Db_Table::getDefaultAdapter();
$authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
$authAdapter->setTableName('users')
->setIdentityColumn('username')
->setCredentialColumn('password');
$authAdapter->setIdentity($formData['username']);
$authAdapter->setCredential(md5($formData['password']));
return $authAdapter;
}
Run Code Online (Sandbox Code Playgroud)
但我想检查数据库中的其他列(IsActive例如).我不知道是否可以使用适配器完成此操作.如何才能做到这一点?
我通过zend auth创建了一个登录系统,这里是代码
// userAuthentication
public function authAction(){
$request = $this->getRequest();
$registry = Zend_Registry::getInstance();
$auth = Zend_Auth::getInstance();
$DB = $registry['DB'];
$authAdapter = new Zend_Auth_Adapter_DbTable($DB);
$authAdapter->setTableName('user')
->setIdentityColumn('user_name')
->setCredentialColumn('user_password');
$username = $request->getParam('username');
$password = $request->getParam('password');
$authAdapter->setIdentity($username);
$authAdapter->setCredential($password);
$result = $auth->authenticate($authAdapter);
if($result->isValid()){
$data = $authAdapter->getResultRowObject(null,'password');
$auth->getStorage()->write($data);
$this->_redirect('/login/controlpannel');
}else{
$this->_redirect('/login/login');
}
}
Run Code Online (Sandbox Code Playgroud)
这项工作现在很好.用户(表)中也有user_id(列),其中也有用户名和密码.我需要从这个表中获取特定的user_id,只需登录并将其放入会话中
$user_session = new Zend_Session_Namespace('user_session');
$user_session->username = $username;
$user_id->user_id = $user_id;
Run Code Online (Sandbox Code Playgroud)
这样我就可以查询这个$ user_id的一些信息,并将结果传递给view(name)controlpanel
这似乎是一个愚蠢的问题,但在这段代码中,我将在哪里插入条件 'WHERE state=1'
public function loginByUsernameAndPassword($username, $password)
{
$this->_auth_adapter = new Zend_Auth_Adapter_DbTable( $this->getAdapter() );
$this->_auth_adapter->setTableName('zend_administration_user')
->setIdentityColumn('user_nm')
->setCredentialColumn('password')
->setCredentialTreatment('SHA1(CONCAT(?,salt))');
$this->_auth_adapter->setIdentity($username)
->setCredential($password);
$result = Zend_Auth::getInstance()->authenticate($this->_auth_adapter);
return $result->isValid();
}
Run Code Online (Sandbox Code Playgroud) 谷歌没有太多的解决方案(类似的问题,但没有答案).
由于bcrypt每次都会生成一个新哈希,因此身份验证失败.我查看了代码(也许是自己扩展类),但它非常混乱(更喜欢本机解决方案).我该怎么$bcrpt->verify()用$identity->isValid()?
编辑:目前,我已经将认证DbTable类子类化,并且它正在运行,但我非常怀疑它是否已经过优化/"完全正确".仍在寻找"优雅"的解决方案.
我有以下情况:我有用户,使用DB表进行标准认证
$authAdapter = new Zend_Auth_Adapter_DbTable(Zend_Db_Table::getDefaultAdapter());
$authAdapter->setTableName('users');
$authAdapter->setIdentityColumn('user_name');
$authAdapter->setCredentialColumn('password');
Run Code Online (Sandbox Code Playgroud)
当用户编辑他的配置文件时,我将其保存到Db中,但我还需要更新存储(使用标准Zend_Auth_Storage_Session).有什么简单的方法怎么做?非常感谢.
我正在创建一个简单的网站,用户可以在其中注册,然后登录并添加文本文章.如果没有登录,访问者将拥有访客的角色,并且只能查看文章.我这样做是作为Zend框架1中的练习,因为我刚开始学习Zend.我将创建一个控制器AuthController用于登录,但我想知道如何从IndexController中的indexAction重定向到该控制器中的登录操作.另外,如何使用自定义插件来实现这种访问控制?我该如何调用它?
我有一个场景,我需要在进行身份验证时检查一些其他列.这是因为,应用程序将一些用户名存储在数据库中,一些用户名存储在LDAP中.身份验证优先级适用于数据库中的用户名.如果数据库中存在用户名,我们将不会检入LDAP,否则我们将在LDAP中进行检查.
对于LDAP用户,我们在同一个"用户"表中保留了一个用户名的副本,其中包含一个空密码列.为了令两组用户感到厌恶,还有一个名为userDirectory的列,其值为"LDAP和INTERNAL".我们必须为应用程序特定设置和所有设置保留LDAP用户名的副本.
username + userDirectory也是uniqueKey
现在我的问题是,有时会有多个用户具有相同的用户名但在不同的userDirectory中.如上所述,LDAP用户不会将密码存储在数据库中,并且该身份验证是一个单独的代码段.
我使用以下代码进行数据库身份验证.即使我添加条件setCredentialTreatment('md5(?)AND userDirectory ="internal"'),它也在搜索LDAP用户.我如何限制userDirectory ='internal'
$dbAdapter = Zend_Db_Table::getDefaultAdapter();
$authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
$authAdapter->setTableName('users')
->setIdentityColumn('username')
->setCredentialColumn('password')
->setCredentialTreatment('md5(?) AND userDirectory="internal"');
$authAdapter->setIdentity($username);
$authAdapter->setCredential($password);
Run Code Online (Sandbox Code Playgroud) 使用默认的Zend_Auth会话存储(PHP会话),它会创建会话ID并将其放入cookie中.如果我想获得经过身份验证的用户的用户名(身份),则该Zend_Auth::getInstance()->getIdentity()方法可以获得该用户名.但是,我想获得用户的会话ID.我只能通过查看$_COOKIE或使用session_id()但似乎是hackish 来获得它,如果我离开PHP会话存储可能会破坏?那么获取Zend_Auth会话的当前会话ID的最佳方法是什么?