2017-06-13 75 views
0

我的管理中心頁面當前位於PagesController(稱爲admin)中。但是,即使無法訪問該中心的所有鏈接,未登錄的用戶以及非管理員用戶都能夠訪問此中心頁面。CakePHP 3 - PagesController上的頁面授權

編輯:我剛剛意識到它可能不工作,因爲「admin」不是PagesController中的函數,而是屬於「display」。

我的AppController如下:

public function initialize() 
{ 
    parent::initialize(); 

    $this->loadComponent('RequestHandler'); 
    $this->loadComponent('Flash'); 
    $this->loadComponent('Auth',[ 
     'authorize' => 'Controller', 
    ]); 

    $this->Auth->allow(['display']); 
} 

public function beforeFilter(Event $event) 
{ 
    $this->Auth->deny(['admin']); 

} 

我PagesController如下:

public function initialize() 
{ 
    parent::initialize(); 
    $this->Auth->deny(['admin']); 
} 

public function isAuthorized($user) 
{ 
    if (in_array($this->request->action,['admin'])) { 
     return (bool)($user['role_id'] === 1); //where role_id = 1 refers to an admin 
    } 
    return parent::isAuthorized($user); 
} 

回答

0

你檢查對行動,而不是前綴。 Documentation表明你想要的是

if ($this->request->getParam('prefix') === 'admin') 
+0

注意[文檔的另一位(https://book.cakephp.org /3.0/en/controllers/components/security.html#usage)將表明'if($ this-> request-> getParam('admin'))'是要走的路。我不使用管理員路由,所以我不能輕易確認哪個是正確的,或者他們都可以接受。 –

1

的Auth->否認()函數是爲了防止unauthoried用戶訪問行爲。另一方面,Auth-> allow()函數是讓公衆訪問特定的(或全部)動作。

請點擊這裏閱讀文檔:https://book.cakephp.org/3.0/en/controllers/components/authentication.html#making-actions-require-authorization

爲了驗證組件的工作,因爲你需要它閱讀以下內容:假設你有一個不同的管理員用戶數據庫表,你想問遊客憑據訪問您可以執行以下操作:

在AppController中,當用戶訪問受限頁面時,或者在您的情況下,當用戶訪問PagesController時,加載Auth組件並確保admin用戶表在Auth中定義當你命名該表時,組件或CakePHP約定被遵循。

在AppController的

public function initialize() 
{ 
    parent::initialize(); 
    if ($this->request->params["controller"] == 'Pages') { 
     $this->loadComponent('Auth', [ 
       'loginAction' => [ 
        'controller' => 'Access', 
        'action' => 'admin_login', 
        'plugin' => 'Access' 
       ], 
       'loginRedirect' => [ 
        'controller' => 'Access', 
        'action' => 'admin_index', 
        'plugin' => 'Access' 
       ], 
       'authenticate' => [ 
        'Form' => [ 
        'userModel' => 'your-admin-database-table' 
       ] 
      ] 
      ]); 
    } 
} 

在PagesController那麼你需要以下條件:

public function initialize() 
{ 
    parent::initialize(); 
} 

在loginAction - 用於管理員登錄。 loginRedirect - 登錄後登錄管理員用戶的地方。 authenticate - 用於定義表單詳細信息,如數據庫名稱和字段。

一個非常詳細的文檔可以在這裏找到:https://book.cakephp.org/3.0/en/controllers/components/authentication.html

編輯:請注意,該代碼尚未經過測試