2015-07-03 107 views
0

我正在一個Zend2項目中工作,那裏有一個整個網站的認證系統,直到我們必須開發一個公共Web服務模塊爲止,這很好。Zend 2和認證配置路由

我想知道是否有可能允許用戶訪問Zend 2的特定模塊/路由?

+0

是的,你需要使用'Zend \ Authentication \ Adapter \ Http'。我在一段時間之前寫了一篇教程。你可以從這裏閱讀。如果有必要,我會創建一個更深入的解釋它的答案。 http://learnzf2.sitrun-tech.com/learn-zf2-authentication – Stanimir

回答

0

The Zend\Authentication\Adapter\Http爲Zend Framework 2應用程序中的Apache身份驗證提供了一種簡單的方法。

它帶有兩個實現基本和摘要HTTP身份驗證,它可以與兩個子組件組合 - 類本身或FileResolver。我們將使用FileResolver來讀取存儲的憑證並將它們與提交的值進行比較。

第一件事第一件事。有幾件重要的事情要知道。

  1. 在MODULE_NAME/config /中創建一個名爲auth的文件夾。在該文件夾內創建兩個文件basic.txt和digest.txt。文件格式對Apache .htpasswd文件很流行。 Basic - <username>:<realm>:<credentials>,這裏的憑證應該以明文形式寫入,例如:basic:authentication:plaintextpasswordDigest - <username>:<realm>:<credentials>, where <credentials>是全部三個部分的MD5哈希值,例如:digest:authentication:dc45122ef294d83e84a8b5a3a6c5356b

  2. 在同一模塊,在這裏我們剛剛創建了我們的權威性文件夾,打開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文件位於提交中並排除在此位置。

+0

@ user3045808如果此答案解決了您的問題,則可以單擊複選標記將其標記爲已接受。 – josliber