2014-09-27 3 views
0

Я использую CakePHP 2.3.6. В одном проекте я должен реализовать User Management System для нескольких пользователей (Users, Admins, etc.). На данный момент я беспокоюсь только о Admin Panel(only 1 Admin for now) и User Panel. Я хочу, чтобы Admin мог получить доступ ко всем областям (включая все страницы User Panel), а Users должен будет login для доступа к определенным областям (страницам), как обычно.Система управления пользователями в CakePHP 2.x ведет себя странно

Я создал 2 controllers для Admin Panel и User Panel, вместо того, различный plugins для различных user panels. Вот код ПОЛНАЯ проекта:

AppController.php : 

public $components=array('Session','RequestHandler','Auth'); 
public function isAuthorized($user){ 
    if(isset($user['role']) && $user['role']==='admin') 
     return true; 
    return false; 
} 

UsersController.php : 

public function beforeFilter(){ 
    parent::beforeFilter(); 
    $this->Auth->loginRedirect=array('action'=>'editProfile'); 
    $this->Auth->logoutRedirect=array('action'=>'index'); 
    $this->Auth->authenticate=array('Form'=>array('scope'=>array('User.role'=>"user"),'userModel'=>'User','fields'=>array('username','password'))); 
    $this->Auth->unauthorizedRedirect=array('action'=>'login'); 
    $this->Auth->loginAction=array('action'=>'login'); 
    $this->Auth->deny('editCv','logout'); 
    $this->layout='user_layout'; 
} 
public function login(){ 
    if($this->request->is('post')) 
     if($this->Auth->login()){ 
      $this->Session->setFlash('Welcome '.$this->User->field('name',array('User.id'=>$this->Auth->user('id')))); 
      $this->redirect($this->Auth->redirect()); 
     }else{ 
      $this->Session->setFlash('Invalid username or password, please try again'); 
      $this->set('title_for_layout','Error - Login'); 
     } 
} 
public function logout(){ 
    $this->redirect($this->Auth->logout()); 
} 

AdminsController.php 

public function beforeFilter(){ 
    parent::beforeFilter(); 
    $this->Auth->loginRedirect=array('action'=>'myJobs'); 
    $this->Auth->logoutRedirect=array('action'=>'index'); 
    $this->Auth->authenticate=array('Form'=>array('scope'=>array('User.role'=>"admin"),'userModel'=>'User','fields'=>array('username','password'))); 
    $this->Auth->authError='Did you really think you are allowed to see that ?'; 
    $this->Auth->unauthorizedRedirect=array('action'=>'index'); 
    $this->Auth->loginAction=array('action'=>'index'); 
    $this->Auth->deny('myUsers','deleteUser','logout'); 
    $this->layout='admin_layout'; 
} 
public function index(){ 
    if($this->request->is('post')) 
     if($this->Auth->login()){ 
      $this->Session->setFlash("<p style='margin-left:20px;color:#366;'><strong>Welcome Admin, You have successfully entered to your Admin Panel!</strong></p>"); 
      $this->redirect($this->Auth->redirect()); 
     }else{ 
      $this->Session->setFlash('Invalid username or password, please try again'); 
      $this->set('title_for_layout','Error - Login'); 
     } 
    else 
     $this->set('title_for_layout','Admin'); 
    $this->layout=false; 
} 
public function logout(){ 
    $this->redirect($this->Auth->logout()); 
} 

Здесь я реализую login в обеих панелях по отдельности, потому что у меня есть 2 разных login pages для обеих панелей. Вот почему я сконфигурировал AuthComponent в 2 панелях индивидуально.

Теперь, что происходит в User panel(UsersController), пользователь не может получить доступ к любой странице без входа в систему, но я хочу, чтобы мои пользователи увидели страницу index без регистрации.

И, когда я войти с Admin panel (AdminsController), это заставляет меня login странице User panel(UsersController) «s, говоря, что я успешно вошел в мою панель администратора, но я до сих пор не могу админ-панель доступа.

Я попробовал $this->Auth->authorize('Controller'), но такой же результат. Я думал, что allow() или deny() здесь будет достаточно, но не знаю, что происходит, в чем моя вина.

Прежде чем я вручную внедрил систему login/logout с использованием Session, и все было хорошо. Затем я подумал использовать AuthComponent, но это сводило меня с ума.

Может ли кто-нибудь помочь мне, пожалуйста?

Благодаря

ответ

2

Первые вещи сначала пытаются следовать coding standards и лучшие практики, как не следует смешивать встроенный CSS с HTML и т.д. Это сделает его гораздо проще взглянуть на код и понять его.

Идет теперь к вашим проблемам. AuthenticationComponent предполагает, что все отклонено, если оно не передано в Auth::allow(). Итак, Auth::deny() просто заставляет ваш код отказывать в ваших уже опровергнутых методах и не допускает остальных. Сначала вы можете сказать Auth::allow('*'), а затем отрицать что-то, но я считаю, что лучше явно разрешать действия, чем явно отрицать их (а затем забыть отрицать новый и выставлять его миру).

Когда вы делаете $this->redirect, перед ним следует инструкция возврата. Таким образом вы прекратите выполнение кода в этот момент, иначе он может продолжить пути, которых вы не ожидали. Поскольку ваша проблема кажется неправильной переадресацией, вместо перенаправления на $this->Auth->redirect() попробуйте $this->redirect(array('controller => 'admin', 'action' => 'index'));.

И наконец, в чем цель AppController::isAuthorized()? Вызывается из какого-то места?

+0

Спасибо, похоже, что это решит мою проблему. На самом деле, я попытался использовать allow() тоже, но тот же результат. И, isAuthorized() нигде не используется, я просто сохранил его здесь в соответствии с примером в документации CakePHP. Хорошо, я попробую еще раз удалить его[email protected] user221931 –

+0

И должен ли я использовать это: $ this-> Auth-> authorize ('Controller')? –

+0

Работает лучше, но все же ведет себя странно. Я привязываюсь к логину с панели «Администратор» и «Пользователь» в том же браузере, на одной вкладке, по одному. Это проблема ? Есть ли проблема с «cookie»? @ user221931 –

Смежные вопросы