Не предоставлять доступ к определенному методу в контроллере, если сеанс не установлен в кодеигниторе
Я хочу, чтобы пользователь не получал доступ к определенному методу контроллера, когда сеанс не установлен. Для этого я могу проверить сеанс во всем методе, и если задан сеанс, перейдите только к файлу else перенаправить на определенную страницу. Поскольку у меня есть много методов, я не хочу, чтобы пользователь получал доступ, если сеанс не установлен. Его объем должен пройти весь метод и проверить сеанс. Есть ли какой-либо способ быстрого доступа к этой функции.
Я попытался проверить, является ли метод конструктора контроллером, но он работает для всех методов. Но я хочу, чтобы только специальный метод блокировал, если сеанс не установлен. Как это сделать.
Пример:
class dashboard extends CI_Controller {
function __construct() {
parent::__construct();
$this->load->library('session');
$this->load->model('dbmodel');
$this->load->helper('url','form');
//verified user check
if($this->session->userdata("unverified") != FALSE) {
redirect("verify_user");
}
}
//verified user check
}
Выше кода перенаправляется на контроллер verify_user, как только "непроверенный" сеанс обнаружен, когда пользователь переходит к контроллеру панели управления. Но я хочу предоставить доступ к некоторому методу контроллера панели. Не все методы. Где, когда этот код перенаправляется всякий раз, когда обнаружен сеанс, и не дает доступа к любому методу контроллера панели.
Ответы
Ответ 1
Проверьте это. Это может помочь вам
class MY_controller extends CI_controller{
function __construct() {
parent::__construct();
}
function _required_user($params =array()){
$action =$this->router->fetch_method();
if(empty($params['except']))
$params['except'] =array();
if(empty($params['only']))
$params['only'] =array();
if(count($params['except']) > 0 && in_array($action,$params['except']))
return true;
if(count($params['only']) > 0 && in_array($action,$params['only']) && $this->session->userdata('is_login'))
return true;
if($this->session->userdata('is_login'))
return true;
redirect('login');
}
}
class dashboard extends MY_Controller {
function __construct() {
parent::__construct();
$this->load->library('session');
$this->load->model('dbmodel');
$this->load->helper('url','form');
$this->_required_user(array('except'=>array('index')))
}
function add(){
/*
Session required
*/
}
function edit(){
/*
Session required
*/
}
function index(){
/*
no session required
*/
}
}
class content extends MY_Controller{
function __construct() {
parent::__construct();
$this->load->library('session');
$this->load->model('dbmodel');
$this->load->helper('url','form');
$this->_required_user(array('only'=>array('index')))
}
function add(){
/*
no Session required
*/
}
function edit(){
/*
no Session required
*/
}
function index(){
/*
session required
*/
}
}
class Myaccount extends MY_Controller{
function __construct() {
parent::__construct();
/*
for all functions session required
*/
$this->_required_user()
}
function edit(){
/*
session required
*/
}
function save(){
/*
session required
*/
}
}
- Только param: check session существует только для заданных функций/функций
- За исключением параметра: не проверять сеанс для заданных функций/функций
- No Param: проверка сеанса для всех функций в контроллере и перенаправление
Вы можете изменить функцию _reuired_user в соответствии с вашим требованием
Ответ 2
вы можете попробовать следующее - если это помогает
создайте в своей папке application/core класс с именем MY_Controller
что-то вроде
class MY_Controller extends CI_Controller
{
public function checkUserSession()
{
if($this->session->userdata("unverified") != FALSE)
{
redirect("verify_user");
}
return true;
}
}
после этого ваш контроллер панели управления должен выглядеть как
class dashboard extends MY_Controller
{
public function show_dashboard()
{
if ($this->checkUserSession())
{
//your code
}
}
}
Ответ 3
Создайте библиотеку с любым именем я created Users.
class Users
{
public function __construct()
{
$this->ci =& get_instance();
}
function _is_logged()
{
if(!$this->ci->session->has_userdata('unverified'))
{
redirect('verify_user');
}
}
}
Загрузите библиотеку или введите ее в автозагрузку в application/config/autoload.php
Затем просто вызовите функцию в верхней части ваших методов, которую вы хотите ограничить.
function abc()
{
$this->users->_is_logged();
// your code
}
Ответ 4
можете ли вы проверить это?
function __construct()
{
parent::__construct();
}
function chk_login()
{
if($this->session->userdata('logged_in'))
{
echo "some action";
}
else
{
redirect('login');
}
}
Ответ 5
Это не ответ, а предложение, основанное на моем опыте:
Как разработчик, это легко сделать, как и в вышеупомянутом ответе @user1048123.
Но, например, если вы обращаетесь к методу (ex: index), для которого сеанс не нужен, но метод function _required_user()
должен обрабатываться до того, как индекс будет отображаться там, где вам нужно передать более крупный массив (например: 30 методов в имени массива). Это замедлит время загрузки методов, для которых сеанс не нужен. Поэтому для лучшей проверки производительности сеанс - это метод (в каждом методе), для которого необходимо проверить сеанс.
Эта идея может быть более старой, но это действительно имеет значение, когда у вас есть большее количество методов или пользователей.
Ответ 6
В контроллере
<?php
class dashboard extends CI_Controller {
function __construct()
{
parent::__construct();
$this->load->library('session');
$this->load->model('dbmodel');
$this->load->helper('url','form');
}
public function index()
{
$user = $this->session->userdata("unverified")//asign session value to variauble
$result = $this->dbmodel->check_user($user);//check user validity
if(empty($result))
{
//user is not verified
$this->load->view('unverified_loging');
}
else
{
//user is verified
$this->load->view('verified_loging');
}
}
В модели
public function check_user($user)
{
$query = $this->db->query("SELECT * FROM user WHERE <argument here>");//check with database
$result = $query->result_array();
return $result;
}
Если пользователь удовлетворен пользователем validity
, он передает данные в $result
. Если он не удовлетворен validity
, он вернет $result
как NULL
.
Итак, в контроллере вы можете проверить, является ли $result
пустым или нет