我正在一個Zend2項目中工作,那裏有一個整個網站的認證系統,直到我們必須開發一個公共Web服務模塊爲止,這很好。Zend 2和認證配置路由
我想知道是否有可能允許用戶訪問Zend 2的特定模塊/路由?
我正在一個Zend2項目中工作,那裏有一個整個網站的認證系統,直到我們必須開發一個公共Web服務模塊爲止,這很好。Zend 2和認證配置路由
我想知道是否有可能允許用戶訪問Zend 2的特定模塊/路由?
The Zend\Authentication\Adapter\Http
爲Zend Framework 2應用程序中的Apache身份驗證提供了一種簡單的方法。
它帶有兩個實現基本和摘要HTTP身份驗證,它可以與兩個子組件組合 - 類本身或FileResolver。我們將使用FileResolver來讀取存儲的憑證並將它們與提交的值進行比較。
第一件事第一件事。有幾件重要的事情要知道。
在MODULE_NAME/config /中創建一個名爲auth的文件夾。在該文件夾內創建兩個文件basic.txt和digest.txt。文件格式對Apache .htpasswd文件很流行。 Basic - <username>:<realm>:<credentials>
,這裏的憑證應該以明文形式寫入,例如:basic:authentication:plaintextpassword
。 Digest - <username>:<realm>:<credentials>, where <credentials>
是全部三個部分的MD5哈希值,例如:digest:authentication:dc45122ef294d83e84a8b5a3a6c5356b
在同一模塊,在這裏我們剛剛創建了我們的權威性文件夾,打開module.config.php文件,並將此代碼。
代碼告訴我們,我們接受的身份驗證方案,境界(必須是相同的基本/ digest.txt文件的境界,digest_domains(只有當我們使用摘要身份驗證)是URL(S )在這裏我們要採用同樣的有效信息,設置的nonce_timeout對於其現時有效的秒數。
/**
* Used for basic authentication
*/
'authentication_basic' => [
'adapter' => [
'config' => [
'accept_schemes' => 'basic',
'realm' => 'authentication',
'nonce_timeout' => 3600,
],
'basic' => __DIR__.'/auth/basic.txt',
],
],
/**
* Used for digest authentication
*/
'authentication_digest' => [
'adapter' => [
'config' => [
'accept_schemes' => 'digest',
'realm' => 'authentication',
'digest_domains' => '/learn-zf2-authentication/digest',
'nonce_timeout' => 3600,
],
'digest' => __DIR__.'/auth/digest.txt',
],
]
LearnZF2Authentication \廠\ BasicAuthenticationAdapterFactory
$config = $serviceLocator->get('Config');
$authConfig = $config['authentication_basic']['adapter'];
$authAdapter = new HttpAdapter($authConfig['config']);
$basic = new FileResolver();
$basic->setFile($authConfig['basic']);
$authAdapter->setBasicResolver($basic);
return $authAdapter;
LearnZF2Authentication \廠\ DigestAuthenticationAdapterFactory
$config = $serviceLocator->get('Config');
$authConfig = $config['authentication_digest']['adapter'];
$authAdapter = new HttpAdapter($authConfig['config']);
$digest = new FileResolver();
$digest->setFile($authConfig['digest']);
$authAdapter->setDigestResolver($digest);
return $authAdapter;
這些都是我們使用通過認證的信息
Module.php
/**
* @var MvcEvent $e
*/
$request = $e->getRequest();
$response = $e->getResponse();
$view = $e->getApplication()->getMvcEvent()->getViewModel();
$sm = $e->getApplication()->getServiceManager();
$authAdapter = $sm->get('LearnZF2Authentication\BasicAuthenticationAdapter');
/**
* Not HTTP? Stop!
*/
if (!($request instanceof Http\Request && $response instanceof Http\Response)) {
return;
}
/**
* Call the factory class and try to authenticate
*/
if ($e->getRouteMatch()->getParam('action') == 'digest') {
$authAdapter = $sm->get('LearnZF2Authentication\DigestAuthenticationAdapter');
}
$authAdapter->setRequest($request);
$authAdapter->setResponse($response);
if($e->getRouteMatch()->getParam('action') == 'basic' || $e->getRouteMatch()->getParam('action') == 'digest') {
$result = $authAdapter->authenticate();
/**
* Pass the information to the view and see what we got
*/
if ($result->isValid()) {
return $view->identity = $result->getIdentity();
} else {
/**
* Create a log function or just use the one from LearnZF2.
* Also make sure to redirect to another page, 404 for example
*/
foreach ($result->getMessages() as $msg) {
return $view->authProblem = $msg;
}
}
}
代碼這是我們使用的代碼通過認證信息
一個要注意的最後一個重要的事情是,你必須包括一個名爲授權n您的要求特殊的頭,更換:
RewriteRule ^(.*)$ %{ENV:BASE}index.php [NC,L]
與
PHP編譯爲CGI不支持apache_response_headers功能,但我們需要此頭文件是爲了在使用CGI或FastCGI運行時執行基本的HTTP驗證。
RewriteRule ^(.*)$ %{ENV:BASE}index.php [E=HTTP_AUTHORIZATION:% {HTTP:Authorization},L,NC]
,並添加公共頂部/ index.php文件
if (isset($_SERVER["REDIRECT_HTTP_AUTHORIZATION"])) {
$_SERVER["HTTP_AUTHORIZATION"] = $_SERVER["REDIRECT_HTTP_AUTHORIZATION"];
}
需要注意以下幾點。 auth文件夾以及來自module.config.php的驗證代碼最好放置在主配置文件夾中,其中全局| local.php文件位於提交中並排除在此位置。
@ user3045808如果此答案解決了您的問題,則可以單擊複選標記將其標記爲已接受。 – josliber
是的,你需要使用'Zend \ Authentication \ Adapter \ Http'。我在一段時間之前寫了一篇教程。你可以從這裏閱讀。如果有必要,我會創建一個更深入的解釋它的答案。 http://learnzf2.sitrun-tech.com/learn-zf2-authentication – Stanimir