Codeigniter 2.x - Аутентификация + библиотека ACL - PullRequest
4 голосов
/ 23 сентября 2011

Мне нужна библиотека аутентификации Codeigniter 2.x ACL +.

Мне нужно иметь 3 разных пользователей-администраторов и двух разных пользователей переднего плана, и я хочу настроить все динамически через базу данных.

Пожалуйста, помогите.

1 Ответ

7 голосов
/ 23 сентября 2011

Две самые популярные библиотеки аутентификации для CI (по крайней мере, в начале этого года) выглядели как Ion_auth и Tank_auth.Ни один из них не отвечает вашим требованиям ACL, хотя Ion_auth предоставляет функциональность для одной группы.

Я начал с Tank_auth в проекте несколько месяцев назад, но переключился на Ion_auth, когда мне потребовалась большая гибкость.С включенной функциональностью я добавил таблицу user_groups и необходимые функции библиотеки и модели, чтобы разрешить множественное членство в группах для каждого пользователя.

Структура данных:

mysql> describe auth_users_groups;
+------------+-----------------------+------+-----+-------------------+----------------+
| Field      | Type                  | Null | Key | Default           | Extra          |
+------------+-----------------------+------+-----+-------------------+----------------+
| id         | int(11) unsigned      | NO   | PRI | NULL              | auto_increment |
| user_id    | mediumint(8) unsigned | NO   |     | NULL              |                |
| group_id   | mediumint(8) unsigned | NO   |     | NULL              |                |
| dt_updated | timestamp             | NO   |     | CURRENT_TIMESTAMP |                |
+------------+-----------------------+------+-----+-------------------+----------------+
4 rows in set (0.00 sec)

Часть добавленного кодав библиотеке:

   public function get_user_groups($user_id = NULL)
   {
      if ($user_id === NULL) $user_id = $this->get_user()->id;
      return $this->ci->ion_auth_model->get_user_groups($user_id)->result();
   }

   /**
    * is_member - checks for group membership via user_groups table
    *
    * @param string $group_name
    * @return bool
    **/
   public function is_member($group_name)
   {
      $user_groups = $this->ci->session->userdata('groups');

      if ($user_groups)
      {
         // Go through the groups to see if we have a match..
         foreach ($user_groups as $group)
         {
            if ($group->name == $group_name)
            {
               return true;
            }
         }
      }
      // No match was found:
      return false;
   }

Часть кода модели:

   public function get_user_groups($user_id = NULL)
   {
      if ($user_id === NULL) return false;
      return $this->db->select('group_id, name, description, dt_updated')
                  ->join($this->tables['groups'], 'group_id = '.$this->tables['groups'].'.id', 'left')
                  ->where('user_id', $user_id)
                  ->get($this->tables['users_groups']);
   }

   public function set_group($user_id, $group_id)
   {
      $values = array('user_id'=>$user_id, 'group_id'=>$group_id);
       $hits = $this->db->where($values)->count_all_results($this->tables['users_groups']);
      if ($hits > 0)
      {
         return NULL;
      }
      return $this->db->insert($this->tables['users_groups'], $values);
   }

   public function remove_groups($user_id, $group_ids)
   {
      $this->db->where('user_id', $user_id);
      $this->db->where_in('group_id', $group_ids);
      return $this->db->delete($this->tables['users_groups']);
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...