ACL (список контроля доступа) Codeigniter по идентификатору пользователя, а не по ролям - PullRequest
0 голосов
/ 10 декабря 2018

Я пытался создать ACL (список контроля доступа), но для каждого идентификатора пользователя, а не по роли, потому что клиент хочет тот же уровень , но имеет другое разрешение

как я могу проверить, есть ли у пользователя, обращающегося к методу или контроллеру, который не имеет разрешения в базе данных

, таблица права доступа структура

+------------------------+--------------+------+-----+---------+----------------+
| Field                  | Type         | Null | Key | Default | Extra          |
+------------------------+--------------+------+-----+---------+----------------+
| permission_id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| permission_name        | varchar(255) | NO   |     | NULL    |                |
| permission_desc        | text         | YES  |     | NULL    |                |
| permission_created_at  | datetime     | YES  |     | NULL    |                |
| permission_modified_at | datetime     | YES  |     | NULL    |                |
+------------------------+--------------+------+-----+---------+----------------+

тогда, permissions таблица имеет отношение к access_role таблица и вот структура allow_role

+--------------------+---------+------+-----+---------+----------------+
| Field              | Type    | Null | Key | Default | Extra          |
+--------------------+---------+------+-----+---------+----------------+
| permission_role_id | int(11) | NO   | PRI | NULL    | auto_increment |
| user_id            | int(11) | NO   | MUL | NULL    |                |
| permission_id      | int(11) | NO   | MUL | NULL    |                |
+--------------------+---------+------+-----+---------+----------------+

сейчас, я запутался, если пользователь обращается к контроллеручто у пользователя нет прав доступа к нему, как я могу это проверить?если проверить по маршруту или URI, но моя база данных не сохранила контроллер класса ... Любое решение, пожалуйста?

Спасибо, и извините за мой плохой английский

1 Ответ

0 голосов
/ 10 декабря 2018

Предполагая Branch .etc.это контроллер, а view, edit - это методы с вашей системой хранения, которые вы должны будете сделать:

class Branch extends CI_Controller {

     public function view {
         $this->acl->can_access(6);
     }

     public function edit {
         $this->acl->can_access(9);
     }
}

Acl Модель:

class Acl extends CI_Model {

     public function can_access($permission_id = null) {
         $uid = $this->session->userdata('user_id');
         if (!is_null($uid) && !is_null($permission_id)) {
             $this->db->where('user_id', $uid);
             $this->db->where('permission_id', $permission_id);
             $this->db->from('permissions_role');
             if ($this->db->count_all_results() > 0) {
                 return;
             }
         }
         show_error('Not allowed'); // function exits
     }

}

Если вы изменили структуру вашей БДчтобы содержать ваш контроллер / метод в таблице permission, вам не нужно было бы включать can_access в каждый метод auth, и вы могли бы просто заставить свои контроллеры расширять MY_Controller кодом, который выглядит следующим образом:

class MY_Controller extends CI_Controller {

    public function __construct() {
        parent::__construct();
        $this->can_access();
    }

    private function can_access() {
        $controller = $this->router->class;
        $method = $this->router->method;
        $curr_user = $this->session->userdata('user_id');
        // do join between permissions and permissions role...
        // check if num_rows > 0 for current user given the controller/method
        // if num_rows is not greater than 0 (user doesn't have permission)
        // then show error. otherwise do nothing (user has permission)
    }

}
...