Я делаю систему, использующую CakePHP, в которой пользователи могут быть либо A, B, либо C. Как ученик, учитель и другая роль. Можно ли разрешить им войти через 1 ссылку? поэтому нет / студенты / логин и / учителя / логин, но что-то вроде www.somewebsite / login для всех из них?
Прочтите этот учебник , он точно охватывает то, о чем вы просите. Также прочтите этот раздел .
Не имеет никакого смысла иметь разные контроллеры для разных типов пользователей, вы просто дублируете код. Если вам нужно предпринять разные действия на основе роли, вы можете сделать это в своем методе входа, вызвав другой метод, например afterStudentLogin (), из вашего метода login () и выполняйте там определенные роли. Причиной этого является то, что один метод должен всегда выполнять только одну задачу, поэтому вы отделяете от него определенный код роли в отдельном методе.
public function login() { if ($this->Auth->user()) { /* ... */ $callback = 'after' . $this->Auth->user('role') . 'Login'); $this->{$callback}($this->Auth->user()); /* ... */ } }
Даже если пользовательские типы сильно отличаются друг от друга, все они будут разделять общую вещь: логин. В этом случае есть таблица пользователей и, например, таблица student_profils
table и teacher_profiles
. Если разница состоит всего лишь в нескольких полях, я бы поставил их все в одну таблицу, как profiles
.
Если вы хотите / login вместо / users / login, вы должны использовать маршрутизацию .
Router::connect( '/login', array( 'controller' => 'users', 'action' => 'login' ) );
Вы также можете взглянуть на этот плагин Users, который охватывает множество обычных задач, связанных с пользователем. И вот простой многопроцессорный адаптер авторизации .
Простая базовая функция входа в систему в зависимости от группы пользователей будет выглядеть так, как указано ниже
<?php public function login() { //if user already logged in call routing function... if($this->Session->read('Auth.User')) { $this->routing(); } if ($this->request->is('post')) { if ($this->Auth->login()) { //if user status is active... if ($this->Auth->user('status') == 1){ //redirect users based on his group id... if($this->Auth->User('group_id')==1){ $this->redirect($this->Auth->redirect('/admins/dashboard')); } else if($this->Auth->User('group_id')==2){ $this->redirect($this->Auth->redirect('/teachers/dashboard')); } else if($this->Auth->User('group_id')==3){ $this->redirect($this->Auth->redirect('/students/dashboard')); } } else{ $this->Session->delete('User'); $this->Session->destroy(); $this->Session->setFlash('Your account is not yet activated. Please activate your account to login.', 'warning'); } } else { $this->Session->setFlash('Your username or password was incorrect.', 'error'); } } } //just route the loggedin users to his proper channel... public function routing() { if($this->Session->read('Auth.User.Group.id') == 1) { $this->redirect('/admins/dashboard'); } else if($this->Session->read('Auth.User.Group.id') == 2) { $this->redirect('/teachers/dashboard'); } else if($this->Session->read('Auth.User.Group.id') == 3) { $this->redirect('/students/dashboard'); } else { $this->Session->destroy(); $this->redirect('/'); } } ?>
с<?php public function login() { //if user already logged in call routing function... if($this->Session->read('Auth.User')) { $this->routing(); } if ($this->request->is('post')) { if ($this->Auth->login()) { //if user status is active... if ($this->Auth->user('status') == 1){ //redirect users based on his group id... if($this->Auth->User('group_id')==1){ $this->redirect($this->Auth->redirect('/admins/dashboard')); } else if($this->Auth->User('group_id')==2){ $this->redirect($this->Auth->redirect('/teachers/dashboard')); } else if($this->Auth->User('group_id')==3){ $this->redirect($this->Auth->redirect('/students/dashboard')); } } else{ $this->Session->delete('User'); $this->Session->destroy(); $this->Session->setFlash('Your account is not yet activated. Please activate your account to login.', 'warning'); } } else { $this->Session->setFlash('Your username or password was incorrect.', 'error'); } } } //just route the loggedin users to his proper channel... public function routing() { if($this->Session->read('Auth.User.Group.id') == 1) { $this->redirect('/admins/dashboard'); } else if($this->Session->read('Auth.User.Group.id') == 2) { $this->redirect('/teachers/dashboard'); } else if($this->Session->read('Auth.User.Group.id') == 3) { $this->redirect('/students/dashboard'); } else { $this->Session->destroy(); $this->redirect('/'); } } ?>