Pek*_*ica 9 php zend-framework zend-auth
我Zend_Auth用于在门户网站中进行身份验证.
一个正常的mySQL"users"表与a login和password列被查询,并且用户登录.
但是,我还有两组我想要进行身份验证的用户.所有这三个用户组都在其他表中拥有登录数据.他们的数据来自外部来源,因此不希望将这些登录帐户合并为一个.
因此,用户可能是来自三个组中的任何一个的经过身份验证的用户,甚至是所有三个组,同时也是这三个组中的任何一个.
三个登录组中的每一个都有自己的登录表单和注销按钮.
目前,我有一个单一,直接的Zend_Auth登录,取自一些教程并稍加修改,看起来大致如下:
function login($user, $password)
{
$auth = Zend_Auth::getInstance();
$storage = new Zend_Auth_Storage_Session();
$auth->setStorage($storage);
$adapter = new Zend_Auth_Adapter_DbTable(....);
$adapter->setIdentity($username)->setCredential($password);
$result = $auth->authenticate($adapter);
if ($result->isValid())
......... success!
else
.... fail!
Run Code Online (Sandbox Code Playgroud)
我将在哪里开始提供此服务并解决三个组的单独"登录"状态?我的想法是,我想分享会话,并分别管理身份验证.
这可能吗?也许有一个简单的前缀使这很容易?这个问题上是否存在任何教程或资源?
我是Zend Framework的新手.
Key*_*ana 10
您应该创建自己的Zend_Auth_Adapter.此适配器将尝试对您的三个资源进行身份验证,并将其标记在私有成员变量中,以便您可以知道哪些登录尝试已经过验证.
要创建Auth适配器,您可以将Zend_Auth_Adapter_DbTable作为基础.
因此,在__construct而不是只传递一个DbTable适配器,您可以传递每个资源中使用的三个适配器.只有当每个人使用不同的资源(例如LDAP)或者甚至是其他数据库时,您才会这样做,否则,您只能传递一个适配器并在配置选项中设置三个不同的表名.
以下是Zend_Auth_Adapter_DbTable的示例:
/**
* __construct() - Sets configuration options
*
* @param Zend_Db_Adapter_Abstract $zendDb
* @param string $tableName
* @param string $identityColumn
* @param string $credentialColumn
* @param string $credentialTreatment
* @return void
*/
public function __construct(Zend_Db_Adapter_Abstract $zendDb, $tableName = null, $identityColumn = null,
$credentialColumn = null, $credentialTreatment = null)
{
$this->_zendDb = $zendDb;
// Here you can set three table names instead of one
if (null !== $tableName) {
$this->setTableName($tableName);
}
if (null !== $identityColumn) {
$this->setIdentityColumn($identityColumn);
}
if (null !== $credentialColumn) {
$this->setCredentialColumn($credentialColumn);
}
if (null !== $credentialTreatment) {
$this->setCredentialTreatment($credentialTreatment);
}
}
Run Code Online (Sandbox Code Playgroud)
下面的方法,从Zend_Auth_Adapter_DbTable尝试对一个表进行身份验证,您可以将其更改为在三个表中进行尝试,对于每个表,当您成功时,将其设置为私有成员变量中的标志.像$ result ['group1'] = 1; 您将为每次成功登录尝试设置1.
/**
* authenticate() - defined by Zend_Auth_Adapter_Interface. This method is called to
* attempt an authentication. Previous to this call, this adapter would have already
* been configured with all necessary information to successfully connect to a database
* table and attempt to find a record matching the provided identity.
*
* @throws Zend_Auth_Adapter_Exception if answering the authentication query is impossible
* @return Zend_Auth_Result
*/
public function authenticate()
{
$this->_authenticateSetup();
$dbSelect = $this->_authenticateCreateSelect();
$resultIdentities = $this->_authenticateQuerySelect($dbSelect);
if ( ($authResult = $this->_authenticateValidateResultset($resultIdentities)) instanceof Zend_Auth_Result) {
return $authResult;
}
$authResult = $this->_authenticateValidateResult(array_shift($resultIdentities));
return $authResult;
}
Run Code Online (Sandbox Code Playgroud)
仅当三次登录尝试中的一次成功通过身份验证时,您才会返回有效的$ authresult.
现在,在您的控制器中,尝试登录后:
public function loginAction()
{
$form = new Admin_Form_Login();
if($this->getRequest()->isPost())
{
$formData = $this->_request->getPost();
if($form->isValid($formData))
{
$authAdapter = $this->getAuthAdapter();
$authAdapter->setIdentity($form->getValue('user'))
->setCredential($form->getValue('password'));
$result = $authAdapter->authenticate();
if($result->isValid())
{
$identity = $authAdapter->getResult();
Zend_Auth::getInstance()->getStorage()->write($identity);
// redirect here
}
}
}
$this->view->form = $form;
}
private function getAuthAdapter()
{
$authAdapter = new MyAuthAdapter(Zend_Db_Table::getDefaultAdapter());
// Here the three tables
$authAdapter->setTableName(array('users','users2','users3'))
->setIdentityColumn('user')
->setCredentialColumn('password')
->setCredentialTreatment('MD5(?)');
return $authAdapter;
}
Run Code Online (Sandbox Code Playgroud)
这里的关键是下面的行,将在您的自定义身份验证适配器中实现:
$identity = $authAdapter->getResult();
Run Code Online (Sandbox Code Playgroud)
您可以将此格式作为Zend_Auth_Adapter_DbTable的基础:
/**
* getResultRowObject() - Returns the result row as a stdClass object
*
* @param string|array $returnColumns
* @param string|array $omitColumns
* @return stdClass|boolean
*/
public function getResultRowObject($returnColumns = null, $omitColumns = null)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
这在成功验证时返回登录尝试中匹配的行.因此,您将创建可以返回此行的getResult()方法以及$ this-> result ['groupX']标志.就像是:
public function authenticate()
{
// Perform the query for table 1 here and if ok:
$this->result = $row->toArrray(); // Here you can get the table result of just one table or even merge all in one array if necessary
$this->result['group1'] = 1;
// and so on...
$this->result['group2'] = 1;
// ...
$this->result['group3'] = 1;
// Else you will set all to 0 and return a fail result
}
public function getResult()
{
return $this->result;
}
Run Code Online (Sandbox Code Playgroud)
毕竟,您可以使用Zend_Acl来控制您的视图和其他操作.由于您将在Zend Auth Storage中拥有标志,因此您可以使用以下角色:
$this->addRole(new Zend_Acl_Role($row['group1']));
Run Code Online (Sandbox Code Playgroud)
这是一些资源:
http://framework.zend.com/manual/en/zend.auth.introduction.html
http://zendguru.wordpress.com/2008/11/06/zend-framework-auth-with-examples/
http://alex-tech-adventures.com/development/zend-framework/61-zendauth-and-zendform.html
| 归档时间: |
|
| 查看次数: |
3253 次 |
| 最近记录: |