Я собираюсь сделать удар, хотя мой подход не совсем применим к Code Igniter.
Способ, которым я решил эту проблему в прошлом, состоит в том, чтобы создать объектную модель User с конструкторомэто берет UserID из первичного ключа базы данных, где хранятся учетные данные.Я напишу статический метод входа в систему, который проверяет учетные данные входа в систему, а затем создает экземпляр и возвращает экземпляр пользователя, если имя входа правильно для строки, а затем устанавливает сеанс.
Пока все хорошо, верно?Таким образом, все ваши разрешения, уровни доступа и т. Д. Хранятся в базе данных.Точно так же, как метод входа в систему, у нас может быть метод обновления, который восстанавливает объект, повторно выбирая из базы данных уже полученный первичный ключ.
class User{
public function __construct($uid){
//fetch from the db here
$sql = 'SELECT FROM User_Table WHERE UserID = ?';
$params = array($uid);
//fetch and assign using your flavor of database access, I use PDO
//set all your object properties for access, as well as user_id, something like
//$this->user_id = $result['UserID'];
}
public static function Login($uname, $pass){
$sql = 'SELECT UserID FROM User WHERE Username = ? AND Password = ?';
$params = array($uname, md5($pass));
//again I'm going to employ pseudocode here, fetch according to your preferred system
if(!empty($result)){
$_SESSION['user'] = new User($result['UserID']);
}else{
//login failed!
return false;
}
}
final public function _refresh(){
//refresher method. Since the controller sets all the object properties for access
//reconstructing and assigning it refreshes these priveliges.
$_SESSION['user'] = new User($this->user_id);
}
}
Используя эту модель, всякий раз, когда я выполняю действиес пользователем в сеансе, который потенциально может нуждаться в чувствительных ко времени разрешениях, я могу вызвать обновление объекта пользователя, все готово в сеансе.Допустим, у нас есть функция контроллера для доступа к закрытой форме.
function _topSecret(){
$_SESSION['user']->refresh();
if($_SESSION['user']->specific_permission_from_db){
//Perform the special action, get the view, whatever.
}else{
//redirect to an error page
}
}
Итак, если у вас уже есть подпрограммы, написанные для администраторов, все, что им нужно сделать, - это установить права пользователя в базе данных, и когдаМетод refresh работает с определенными, чувствительными ко времени функциями, эти данные будут помещены в сеанс для пользователя.Таким образом, вы не обязательно обновляете другой сеанс пользователя , вы просто определяете, какие действия настолько хронологически чувствительны, что им требуются новейшие разрешения, и выдает эту команду объекту пользователя в сеансе.
Это оказалось довольно эффективным для меня, так как реконструкция должна выполняться только для действий, которые требуют самых последних разрешений.Опять же, я не уверен, насколько это может быть полезно в контексте CI и вашего отдельного приложения, но я решил поделиться.Я предполагаю, что вы уже выполнили все необходимые меры безопасности сеанса и начали сеанс - большинство фреймворков, таких как CI, справятся с этим с помощью собственных средств.