我想在不使用密码的情况下对用户进行身份验证。因此 isValid()应该以某种方式设置为true而不使用 setIdentityValue(用户名), setCredentialValue(密码)和 authenticate()
如何在没有用户名/密码的情况下成功进行身份验证?
这听起来很奇怪,但在这种情况下,网络服务器确实处理了身份验证(SAML)。每个将由网络服务器授予访问权限的用户都应自动访问该网站。我需要ZF身份验证,因为它也可以使用用户名/密码访问网站。
答案 0 :(得分:2)
您可以创建自己的适配器类来执行虚拟身份验证。
class DummyDBAuthAdapter implements Zend\Authentication\Adapter\AdapterInterface
{
public function authenticate()
{
return Zend\Authentication\Result::SUCCESS;
}
}
因此,每当用户使用SAML进行身份验证时,您都可以从数据库适配器切换到此适配器。
答案 1 :(得分:1)
use Zend\Authentication\Adapter\AdapterInterface;
use Zend\Authentication\Result;
class NoPasswordAuthAdapter implements AdapterInterface
{
protected $identity;
public function setIdentity($identity)
{
$this->identity = $identity;
return $this;
}
public function authenticate()
{
return new Result(
Result::SUCCESS,
$this->identity,
array('Authentication successful.')
);
}
}
感谢您的帮助。
答案 2 :(得分:0)
当ZF身份验证到来时,您必须提供一些用户名和密码作为适配器的凭据。
必须稍后传递给authenticate($adapter)
。因此,根据您的要求不提供任何凭据并设置isValid() == true
,您必须通过每个用户对您的数据库中的某个凭据进行硬编码来手动执行请求。我在这里举例说明ZF2 authentication:
use Zend\Authentication\AuthenticationService;
// instantiate the authentication service
$auth = new AuthenticationService();
// Set up the authentication adapter
$authAdapter = new My\Auth\Adapter($username, $password);
// Attempt authentication, saving the result
$result = $auth->authenticate($authAdapter);
if (!$result->isValid()) {
// Authentication failed; print the reasons why
foreach ($result->getMessages() as $message) {
echo "$message\n";
}
} else {
// Authentication succeeded; the identity ($username) is stored
// in the session
// $result->getIdentity() === $auth->getIdentity()
// $result->getIdentity() === $username
}