Skip to content

Instantly share code, notes, and snippets.

@demonio
Last active June 1, 2016 08:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save demonio/2602d81ef666f3dccce2688d7985bb07 to your computer and use it in GitHub Desktop.
Save demonio/2602d81ef666f3dccce2688d7985bb07 to your computer and use it in GitHub Desktop.
Modulo de permisos

Modulo de permisos

  • Un modelo, un controlador y una vista es todo lo que necesitas para mantener a tus usuarios a raya.
  • Crea la tabla del archivo .SQL y desde /admin/permisos crea reglas.
  • Situa el desencadenador en uno de los controladores padre, libs/app_controller.php o libs/admin_controllers.php
/* EJEMPLO DE UN USUARIO */
$controller->operador->nombre_usuario = 'rmontejano';
$controller->operador->rol = 7;

/* DESENCADENADOR DEL MODULO DE PERMISOS */
(new TpPermisos)->comprobar($this);
        
  
<!--
app/views/admin/permisos.index.phtml
-->
<form method="post">
<div class="actions">
<button class="btn-floating darken-1 orange tooltipped waves-effect waves-light" data-delay="500" data-position="left" data-tooltip="guardar permisos" name="accion" type="submit" value="guardar"><i class="material-icons">save</i></button>
</div>
<div class="mt5 ml5 mr50">
<div class="card row">
<h5 class="col s12 teal-text darken-1 pv10">reglas</h5>
</div>
<div class="row" id="dispositivos">
<?php foreach ($reglas as $regla) : ?>
<div class="dispositivo card mb5">
<!--<input type="hidden" name="permisos[id_tp_permisos][]" value="<?=$regla->id_tp_permisos?>" />-->
<p class="col s12 m2 l2">
<label>al:</label>
<select name="permisos[al][]">
<option value="todos"<?php if ($regla->al == 'todos') echo ' selected'; ?>>todos</option>
<option value="grupo"<?php if ($regla->al == 'grupo') echo ' selected'; ?>>grupo</option>
<option value="operador"<?php if ($regla->al == 'operador') echo ' selected'; ?>>operador</option>
<option value="rol"<?php if ($regla->al == 'rol') echo ' selected'; ?>>rol</option>
</select>
</p>
<p class="col s12 m2 l2">
<label>específico:</label>
<input name="permisos[especifico][]" type="text" value="<?php echo empty($regla->especifico ) ? 'todos' : $regla->especifico; ?>" />
</p>
<p class="col s12 m2 l2">
<label>modulo:</label>
<input name="permisos[modulo][]" type="text" value="<?php echo empty($regla->modulo ) ? 'todos' : $regla->modulo; ?>" />
</p>
<p class="col s12 m2 l2">
<label>controlador:</label>
<input name="permisos[controlador][]" type="text" value="<?php echo empty($regla->controlador ) ? 'todos' : $regla->controlador; ?>" />
</p>
<p class="col s12 m2 l2">
<label>accion:</label>
<input name="permisos[accion][]" type="text" value="<?php echo empty($regla->accion ) ? 'todas' : $regla->accion; ?>" />
</p>
<p class="col s12 m2 l2">
<label>permitir:</label>
<select name="permisos[permitir][]">
<option value="no"<?php if ($regla->permitir == 'no') echo ' selected'; ?>>no</option>
<option value="si"<?php if ($regla->permitir == 'si') echo ' selected'; ?>>si</option>
</select>
</p>
<p class="col s2">
<a data-item="dispositivo" class="remove top right btn btn-corner btn-leaf waves-effect waves-light red darken-1"><i class="material-icons">remove</i></a>
</p>
<br class="end" />
</div>
<?php endforeach; ?>
</div>
</div>
<a data-here="dispositivos" data-item="dispositivo" class="add btn btn-corner btn-leaf clone darken-1 green ml5 waves-effect waves-light"><i class="material-icons">add</i></a>
</form>
/**
* app/config/permisos.sql
*/
CREATE TABLE tp_permisos
(
id_tp_permisos int PRIMARY KEY IDENTITY(1,1),
al nvarchar(50),
especifico nvarchar(50),
modulo nvarchar(50),
controlador nvarchar(50),
accion nvarchar(50),
permitir nvarchar(50),
creado datetime2(7),
modificado datetime2(7),
eliminado datetime2(7),
creado_por nvarchar(50),
modificado_por nvarchar(50),
eliminado_por nvarchar(50),
);
<?php
/**
*/
class PermisosController extends AdminController
{
protected function before_filter()
{
if ( Input::request('accion') ) $this->{Input::request('accion')}();
}
public function index()
{
$campos[] = (new TpPermisos)->camposVacios();
$this->reglas = (new TpPermisos)->obtener() + $campos;
}
public function guardar()
{
(new TpPermisos)->guardar($_POST['permisos']);
}
public function install()
{
$sql = file_get_contents(APP_PATH . 'config/permisos.sql');
(new ActRecord)->sql($sql);
exit( Redirect::to("admin/modules/index/permisos") );
}
public function uninstall()
{
$files = array
(
'config/permisos.sql',
'controllers/admin/permisos_controller.php',
'models/tp_permisos.php',
'views/admin/permisos/index.phtml',
);
foreach ($files as $file)
{
$filename = APP_PATH . $file;
unlink($filename);
}
$sql = "DROP TABLE tp_permisos";
(new ActRecord)->sql($sql);
exit( Redirect::to("admin/modules/index/permisos") );
}
}
<?php
/**
* app/models/tp_permisos.php
*/
class TpPermisos extends ActRecord
{
protected static $pk = 'id_tp_permisos';
public function comprobar($controller)
{
$permitir = 'si';
$nombre_usuario = $controller->operador->nombre_usuario;
$rol = $controller->operador->rol;
$modulo = $controller->module_name;
$controlador = $controller->controller_name;
$accion = $controller->action_name;
$reglas = $this->obtener();
foreach ($reglas as $regla)
{
if ($regla->al == 'operador')
{
if ($regla->especifico <> 'todos' and $regla->especifico <> $nombre_usuario) continue;
}
else if ($regla->al == 'rol')
{
if ($regla->especifico <> 'todos')
{
if ($regla->permitir == 'si' and $regla->especifico < $rol) continue;
else if ($regla->permitir == 'no' and $regla->especifico > $rol) continue;
}
}
if ($regla->modulo <> 'todos' and $regla->modulo <> $modulo) continue;
if ($regla->controlador <> 'todos' and $regla->controlador <> $controlador) continue;
if ($regla->accion <> 'todas' and $regla->accion <> $accion) continue;
$permitir = $regla->permitir;
}
if ($permitir == 'no') _::d('No puedes pasar !!');
}
public function guardar($columnas)
{
$sql = 'DELETE FROM tp_permisos';
$this->sql($sql);
foreach ($columnas as $campo=>$valores)
{
foreach ($valores as $fila=>$valor)
{
$filas[$fila][$campo] = $valor;
}
}
foreach($filas as $fila)
{
$sql = 'INSERT INTO tp_permisos ';
$sql .= $this->values($fila);
$this->sql($sql);
}
}
public function obtener()
{
$sql = 'SELECT * FROM tp_permisos WHERE eliminado IS NULL';
return $this->allBySql($sql);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment