CodeIgniter: проверка, зарегистрирован ли пользователь для нескольких страниц
У меня есть контроллер, который отображается в разделе моего сайта, и все страницы внутри него (методы) должны появляться только в том случае, если пользователь вошел в систему. В противном случае они должны быть перенаправлены обратно на экран входа в систему.
Чтобы заставить его работать, я только что сделал это:
function index() {
if ($this->session->userdata('logged_in')) {
$this->load->view('main');
} else {
redirect('/login');
}
}
function archive() {
if ($this->session->userdata('logged_in')) {
и т.д.... повторяя эту проверку в каждом методе. Какой самый простой способ выполнить эту проверку один раз для нескольких или всех методов в контроллере?
Ответы
Ответ 1
Вы можете запускать код в каждом методе Контроллера, запустив его в методе __construct()
:
function __construct()
{
parent::__construct();
if ( ! $this->session->userdata('logged_in'))
{
// Allow some methods?
$allowed = array(
'some_method_in_this_controller',
'other_method_in_this_controller',
);
if ( ! in_array($this->router->fetch_method(), $allowed)
{
redirect('login');
}
}
}
Вы можете удалить "разрешенные" биты, если хотите ограничить доступ ко всему предмету, но есть лучшие способы сделать это, например создание базового контроллера:
// Create file application/core/MY_Controller.php
class Auth_Controller extends CI_Controller {
function __construct()
{
parent::__construct();
if ( ! $this->session->userdata('logged_in'))
{
redirect('login');
}
}
}
Затем ваши ограниченные контроллеры расширяют Auth_Controller
вместо CI_Controller
. Теперь ваш код будет запускаться каждый раз при загрузке контроллера.
Дополнительная информация о расширении основных классов: http://www.codeigniter.com/user_guide/general/core_classes.html#extending-core-class
Также представляет интерес: http://php.net/manual/en/language.oop5.decon.php
Ответ 2
Для CodeIgniter 3 я изменил Wesley Murch на этот
//Создание файлового приложения /core/MY _Controller.php
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class MY_Controller extends CI_Controller {
function __construct()
{
parent::__construct();
$CI = & get_instance();
$CI->load->library('session');
$CI->load->helper('url');
if ( !$this->session->userdata('logged_in'))
{
redirect('login');
}
}
}
Затем в любом контроллере для проверки авторизации я использовал
class News extends MY_Controller { // код здесь }
Если вы используете модули и разные сеансы для пользователей веб-сайтов и пользователей admin, вы можете использовать этот код, чтобы полностью перенаправить их на разные страницы входа -
function __construct() {
parent::__construct();
$CI = & get_instance();
$CI->load->library('session');
$CI->load->helper('url');
// echo "<pre>";print_r($this->router);echo "</pre>";
/**
* if webmaster then check admin session else check user session
* But there may be some classes method that doesn't requires login hence it is also need to check if
* current request is for those methods before checking session
*/
//to use $this->config->item('webmaster_name') this you have to define
// $config['webmaster_name'] = "webmaster"; in config.php file
if ($this->router->module == $this->config->item('webmaster_name')) {
if (!$this->session->userdata('admin')['id']) {
redirect($this->config->item('webmaster_name').'/login');
}
} else {
if (!$this->session->userdata('user')['id']) {
redirect('login');
}
}
}
Если вы также хотите, чтобы пользователи разрешали доступ к некоторым методам с любого конкретного контроллера без входа в систему, вы можете использовать этот код -
function __construct() {
parent::__construct();
$CI = & get_instance();
$CI->load->library('session');
$CI->load->helper('url');
//echo "<pre>"; print_r($this->router);echo "</pre>"; //_pr($this->config->item('excluded_auth'));
/**
* if webmaster then check admin session else check user session
* But there may be some classes method that doesn't requires login hence it is also need to check if
* current request is for those methods before checking session
*/
if ($this->router->module == $this->config->item('webmaster_name')) {
if (!$this->session->userdata('admin')['id']) {
redirect($this->config->item('webmaster_name') . '/login');
}
} else {
if (array_key_exists($this->router->class, $this->config->item('exclude_auth')) && in_array($this->router->method, $this->config->item('exclude_auth')[$this->router->class])) {
//echo "escape this method. don not validate for a session";
} else {
if (!$this->session->userdata('user')['id']) {
redirect('login');
}
}
}
}
Примечание. Вы можете определить настраиваемый файл конфигурации для определения исключенных методов, например, как -
//save file in application/config/without_auth_methods.php
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
$config['exclude_auth']['news'] = array('index', 'view');
$config['exclude_auth']['users'] = array('index');
Ответ 3
Я использую эту функцию:
Затем просто вызовите $this- > isAuthorized из ваших контроллеров __construct.
Он позволяет мне контролировать, к каким контроллерам обращаются и к каким методам также обращаются.
protected function isAuthorized()
{
switch ( strtolower( $this->router->class ) )
{
case 'pages':
$disallowLoggedOut = array( 'dashboard' );
$disallowLoggedIn = array( 'index' );
break;
case 'users':
$disallowLoggedOut = array( 'logout' );
$disallowLoggedIn = array( 'register', 'login' );
break;
}
if ( $this->session->userdata( 'loggedIn' ) )
{
if ( in_array( $this->router->method, $disallowLoggedIn ) )
{
redirect( 'pages/dashboard' );
}
}
else
{
if ( in_array( $this->router->method, $disallowLoggedOut ) )
{
redirect( 'pages/index' );
}
}
}