sesion - privilegios en php
Codeigniter: control de privilegios de inicio de sesiĆ³n con herencia (1)
Estoy buscando hacer logins con mi proyecto codeigniter.
Algunas consideraciones:
1) Hay dos controladores que están afuera que no requieren autenticación. Uno para información (splash_pages y demás) y el otro para crear una sesión iniciada.
2) Todos los demás controladores heredan de un Controlador maestro que, como parte de su constructor, requiere que inicies sesión o te lleve a la pantalla de inicio de sesión.
Hasta ahora, el anterior 2 funciona bien para iniciar sesión o para desconectarse.
En términos de código:
El controlador maestro que estaba describiendo para 2) Se encuentra en la carpeta Core de Codeigniter
class MY_Controller extends CI_Controller
{
public function __construct()
{
parent::__construct();
$this->load->library(''cart'');
$this->load->library(''session'');
$this->load->helper(''form'');
$this->load->library(''form_validation'');
if (!$this->session->userdata(''loggedin'')){
redirect(''/sessions/log_in/'',''refresh'');
}
}
Una clase que usa el sistema de inicio de sesión:
class Records extends MY_Controller {
public function __construct()
{
parent::__construct();
$this->load->model(''some_model'');
$this->load->library(''some_library'');
}
La idea es que en la construcción del objeto, verifique si el usuario está conectado o no y construye el objeto correctamente o redirige a la pantalla de inicio de sesión.
Sin embargo, las necesidades del proyecto han cambiado un poco. Los requisitos ahora establecen que hay alrededor de 6 grupos de usuarios diferentes dispuestos cuyos privilegios se pueden organizar en subconjuntos. A puede hacer I, B puede hacer A + II, C puede hacer B + III, y así sucesivamente. Ha habido leves indicios de que puede haber privilegios que no son estrictamente subconjuntos (IE solo B puede hacer la tarea IV), pero esto aún no se ha confirmado, así que quiero mantener mis opciones abiertas.
Cómo estoy visualizando hacerlo es tener un grupo de Controladores de MY_Controller que heredan de MY_Controller.
Por ejemplo, en la carpeta Core:
class MY_AsController extends MY_Controller {
public function __construct(){
parent::__construct();
$accountType = $this->session->userdata(''accountType'');
if(!($accountType == declaredConstant)){
redirect(''/someController/someMethod'',''refresh'');
}
}
Luego en la carpeta de controladores:
class AControlPage extends MY_AsController {
//Insert page functions that only As have access to here
}
Desafortunadamente, aplicarlo en la práctica no genera ningún error, solo una página en blanco. No estoy seguro de qué hacer después de eso sin embargo.
Terminó sin cambiar el constructor padre o usar más herencia en absoluto:
Agregué lo siguiente a My_Controller:
public function allowedToView($userAccountType, $requiredAccountTypes){
//If user not in allowed userGroup
if(!(in_array($userAccountType,$requiredAccountTypes))){
redirect(''/sessions/not_allowed/'',''refresh'');
}
}
Cambió el constructor hijo a:
public function __construct() {
parent::__construct();
$accountType = $this->session->userdata(''accountType'');
$allowedTypes = array(declaredConstant1,declaredConstant2,...);
$this->allowedToView($accountType,$allowedTypes);
}
Gracias, Joseph por la visión que me aleja de mi locura.