Foros del Web » Programando para Internet » PHP »

Acceso a registros de MySQL de acuerdo a su nivel de usuario

Estas en el tema de Acceso a registros de MySQL de acuerdo a su nivel de usuario en el foro de PHP en Foros del Web. Saludos a la comunidad, espero me puedan ayudar con esto. Estoy desarrollando un sistema de publicación de noticias, el cual, del lado de la intranet, ...
  #1 (permalink)  
Antiguo 14/08/2013, 15:57
Avatar de lordalucardmx  
Fecha de Ingreso: junio-2012
Ubicación: Cuernavaca
Mensajes: 38
Antigüedad: 12 años, 5 meses
Puntos: 1
Acceso a registros de MySQL de acuerdo a su nivel de usuario

Saludos a la comunidad, espero me puedan ayudar con esto.
Estoy desarrollando un sistema de publicación de noticias, el cual, del lado de la intranet, existirán usuarios con diferentes privilegios/cargos o puestos, donde habrá uno llamado Administrador, que puede dar de alta artículos y usuarios, además de bajas, modificaciones y todo lo que se pueda hacer con los registros.
Debajo del administrador habrá hasta 3 o 4 niveles de usuario, por ejemplo los ejecutivos debajo del administrador pueden dar de alta artículos, pero no usuarios, y los que están debajo de los ejecutivos hay otro tipo de usuarios que serán únicos, es decir, serán aprox. 10 usuarios, y cada usuario solo podrá dar de alta artículos de su propia categoría, por ejemplo: el usuario 1 sube un artículo perteneciente a deportes, y solo puede ver los que él ha creado y nada más, el usuario 2 sube un artículo de educación y sólo puede ver los suyos, y así sucesivamente.
El administrador y los ejecutivos por supuesto pueden dar de alta en cualquier categoría de artículos, pero además ellos son los que autorizan que se muestren en la página de inicio.
Tengo mi clase de conexión, la de usuarios, y la base de datos, pero no se me ocurre cómo gestionar esos detalles por medio de PHP, más allá de manejar $_SESSION y asignarle el id de usuario, su cargo, nivel, etc.
  #2 (permalink)  
Antiguo 14/08/2013, 16:16
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años, 1 mes
Puntos: 84
Respuesta: Acceso a registros de MySQL de acuerdo a su nivel de usuario

para que un usuario se registre tienes un usuario en mysql global, cierto?

tengo una idea. trabaja con dos tipos de usuarios, uno en mysql y otro usuario final.
de modo que qué tal si creas varios usuarios con determinados permisos en mysql, luego una tabla con los nombres de esos usuarios y una contraseña. en la tabla usuarios crea un campo llamado permisos.

la idea es que cuando un usuario se registre cargues en la sesión el usuario y la contraseña a la que ese usuario registrado está relacionado (con primay key y foreign key) con el usuario en mysql el cual va a acceder a los articulos y altas/bajas de usuarios, de manera que cuando conecte a la base de datos para articulos y usuarios le deje o no le deje.

creo que puede servirte.
__________________
Ayúdame a hacerlo por mi mismo.
  #3 (permalink)  
Antiguo 14/08/2013, 17:01
 
Fecha de Ingreso: julio-2013
Ubicación: México
Mensajes: 361
Antigüedad: 11 años, 4 meses
Puntos: 55
Respuesta: Acceso a registros de MySQL de acuerdo a su nivel de usuario

Hola, yo creo que no son detalles, lo que quieres realizar es una logica y estructura completa de tu sistema.

Lo puedes hacer dependiendo del nivel de programación que manejes.

1.- Crea paginas de acceso distintas para cada tipo usuario y al loguear, identificas que tipo de usuario es, lo puedes hacer con switch, o con algunos if.
Contras:Despues de tener cierto tamaño, será muy difícil mantenerlo, depurarlo y escalarlo.

2.- Si llevas una estructura MVC, puedes hacer lo siguiente:
a) integras tus clases y sus métodos en una tabla.(vistas y modelos).
b) una tabla para que asignes a los usuarios los privilegios que tendran dependiendo de las clases y metodos de tu sistema.
c)Cada vez que realices una petición a tu controlador, en lugar de procesarla inmediatamente, verificas que tengan los privilegios en tu base integradora.

Espero te sea de ayuda.
  #4 (permalink)  
Antiguo 14/08/2013, 17:39
Avatar de lordalucardmx  
Fecha de Ingreso: junio-2012
Ubicación: Cuernavaca
Mensajes: 38
Antigüedad: 12 años, 5 meses
Puntos: 1
Respuesta: Acceso a registros de MySQL de acuerdo a su nivel de usuario

Ya tengo una estructura, pero todavía no se me ocurre cómo hacerlo de manera eficaz, y pretendo hacerlo con MVC. Tomaré en cuenta sus opiniones y si hay algún ejemplo simple para guiarme, mejor.
Saludos.
  #5 (permalink)  
Antiguo 14/08/2013, 18:05
 
Fecha de Ingreso: enero-2012
Ubicación: <?php echo"Los teques"; ?>/////estado miranda
Mensajes: 196
Antigüedad: 12 años, 10 meses
Puntos: 9
Respuesta: Acceso a registros de MySQL de acuerdo a su nivel de usuario

Yo añadiria un campo a la tabla usuarios, y uno a la tabla de la cual quieres restringir, esto sera "rango"

Ahora, Pones numeros, Ejemplo: Admin = 5, Ejecutivos = 4, Y a los registros tabla le pones el numero de dicho usuario, para admin, usas 5

Luego en tu Query usas esta SQL

Código SQL:
Ver original
  1. $rango = $_SESSION['rango'];
  2. $sql = "SELECT * FROM tutabla WHERE rango ='$rango' OR rango < '$rango'";
  3. $query= mysql_query($sql);
Eso solo seleccionara los registros con tu Rango o un Rango menor
  #6 (permalink)  
Antiguo 14/08/2013, 18:54
Avatar de lordalucardmx  
Fecha de Ingreso: junio-2012
Ubicación: Cuernavaca
Mensajes: 38
Antigüedad: 12 años, 5 meses
Puntos: 1
Respuesta: Acceso a registros de MySQL de acuerdo a su nivel de usuario

Tengo las siguientes tablas que diseñe en MySQL Workbench:
-usuario con los campos: usrId, crId (Es el cargo que tiene el usuario dentro de la institución, enlazado con la tabla cargo), nvId (Nivel de usuario, el cual indica si es Administrador, ejecutivo u otro tipo de usuario), usrStatus (1 si está activo y 0 si está inactivo).
-articulo con los campos: artId, artUsrId (clave foránea del usuario que dió de alta el artículo), artSecId (clave foránea de la sección a la que pertenece el artículo, como salud, deportes, educación, etc.) artTtitulo, artFecha, artCont (Contenido del artículo), artStatus (1 si fue aprobado por el administrador o alguno de los ejecutivos, y 0 si aún no está aprobado).
-seccionarticulo con los campos: secId y secNombre.
No pongo las demás tablas y campos de porque éstas son las que más me importan para hacer mi cometido, además de que son muchas, ya que también tengo tablas donde se guardarán las rutas de los archivos e imágenes que pertenecen a un artículo.
El problema es que al usuario no quiero asignarle a qué secretaría pertenece, porque ya está relacionado la tabla seccionarticulo con el artículo que el usuario ha creado.

Estoy creando la clase Articulo, Usuario y Sesion (el que tiene los métodos para iniciar sesión, si ya existe el usuario, el correo, otro para recuperar contraseñas, etc.) y tengo mi clase de conexión a MySQL con PDO y una clase que recoge las excepciones cuando se ejecutan las consultas y que lo guarda en un archivo logs.

Última edición por lordalucardmx; 14/08/2013 a las 19:00
  #7 (permalink)  
Antiguo 15/08/2013, 18:00
Avatar de lordalucardmx  
Fecha de Ingreso: junio-2012
Ubicación: Cuernavaca
Mensajes: 38
Antigüedad: 12 años, 5 meses
Puntos: 1
Respuesta: Acceso a registros de MySQL de acuerdo a su nivel de usuario

Ahora me surge otro problema en cuanto a herencia de métodos y atributos de clases:
Teno una clase Log que guarda excepciones en un archivo y la clase Database hereda todo sobre él, y a su vez creo un objeto sesion que toma los métodos de Database para ejecutar las consultas, y éste me guarda las excepciones en el archivo log, pero en una validación que tengo no me muestra el mensaje de error en la página.

Database.class.php
Código PHP:
Ver original
  1. <?php
  2. require_once('core/classes/log.class.php');
  3. class Database extends Log{
  4.  
  5.     private static $host      = ''/*DB_HOST*/;
  6.     private static $user      = ''/*DB_USER*/;
  7.     private static $pass      = ''/*DB_PASS*/;
  8.     protected $dbname    = ''/*DB_NAME*/;
  9.     protected $stmt;
  10.     protected $charset   = '';
  11.     private $db;
  12.  
  13.     public function __construct($host, $user, $pass, $dbname, $charset = 'utf8'){
  14.         self::$host = $host;
  15.         self::$user = $user;
  16.         self::$pass = $pass;
  17.         $this->dbname = $dbname;
  18.         $this->charset = $charset;
  19.         // Set DSN
  20.         $dsn = 'mysql:host=' . self::$host . ';dbname=' . $this->dbname . ';charset=' . $this->charset;
  21.         // Set options
  22.         $options = array(
  23.             PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
  24.             PDO::ATTR_PERSISTENT    => true,
  25.             PDO::ATTR_ERRMODE       => PDO::ERRMODE_WARNING,
  26.             PDO::ATTR_ERRMODE       => PDO::ERRMODE_EXCEPTION
  27.         );
  28.         // Create a new PDO instanace
  29.         try{
  30.             $this->db = new PDO($dsn, self::$user,self::$pass, $options);
  31.         }
  32.         // Catch any errors
  33.         catch(PDOException $e){
  34.             $this->elog($e);
  35.             $this->setException($e);
  36.         }
  37.     }
  38.  
  39.     private function close(){
  40.         $this->db = NULL;
  41.     }
  42.  
  43.     protected function getList($query, $flag){
  44.             $this->query($query);
  45.             $rows = $this->resultset($flag);
  46.             return $rows;
  47.     }
  48.  
  49.     protected function query($query){
  50.         $this->stmt = $this->db->prepare($query);
  51.     }
  52.  
  53.     protected function bind($param, $value, $type = null){
  54.         if (is_null($type)) {
  55.             switch (true) {
  56.                 case is_int($value):
  57.                     $type = PDO::PARAM_INT;
  58.                     break;
  59.                 case is_bool($value):
  60.                     $type = PDO::PARAM_BOOL;
  61.                     break;
  62.                 case is_null($value):
  63.                     $type = PDO::PARAM_NULL;
  64.                     break;
  65.                 default:
  66.                     $type = PDO::PARAM_STR;
  67.             }
  68.         }
  69.         $this->stmt->bindValue($param, $value, $type);
  70.     }
  71.  
  72.     protected function execute(){
  73.         try{
  74.             return $this->stmt->execute();
  75.         }catch(PDOException $e){
  76.             $this->elog($e);
  77.             $this->setException($e);
  78.         }
  79.     }
  80.  
  81.     protected function fetchColumn(){
  82.         try{
  83.             $this->execute();
  84.             return $this->stmt->fetchColumn();
  85.         }catch(PDOException $e){
  86.             $this->elog($e);
  87.             $this->setException($e);
  88.         }
  89.     }
  90.  
  91.     protected function resultset($flag = false){
  92.         try{
  93.             $this->execute();
  94.             if($flag === true){
  95.                 return $this->stmt->fetchAll(PDO::FETCH_ASSOC);
  96.             }else{
  97.                 return $this->stmt->fetchAll();
  98.             }
  99.         }catch(PDOException $e){
  100.             $this->elog($e);
  101.             $this->setException($e);
  102.         }
  103.     }
  104.  
  105.     protected function single(){
  106.         try{
  107.             $this->execute();
  108.             return $this->stmt->fetch(PDO::FETCH_ASSOC);
  109.         }catch(PDOException $e){
  110.             $this->elog($e);
  111.             $this->setException($e);
  112.         }
  113.     }
  114.  
  115.     protected function rowCount(){
  116.         return $this->stmt->rowCount();
  117.     }
  118.  
  119.     protected function lastInsertId(){
  120.         return $this->db->lastInsertId();
  121.     }
  122.  
  123.     protected function beginTransaction(){
  124.         return $this->db->beginTransaction();
  125.     }
  126.  
  127.     protected function endTransaction(){
  128.         return $this->db->commit();
  129.     }
  130.  
  131.     protected function cancelTransaction(){
  132.         return $this->db->rollBack();
  133.     }
  134.  
  135.     protected function debugDumpParams(){
  136.         return $this->stmt->debugDumpParams();        
  137.     }
  138.  
  139. }
  140.  
  141. ?>

Log.class.php

Código PHP:
Ver original
  1. <?php
  2. abstract class Log{
  3.  
  4.     protected $statusEx = false;
  5.     protected $getCode;
  6.     protected $getMessage;
  7.     protected $msj = array();
  8.  
  9.     protected function eLog(Exception $e){
  10.         $fo = fopen(dirname(dirname(dirname(__FILE__)))."\logs\\".date('ymd').'.log','a');
  11.         fwrite($fo,"[".date("r")."] " .$e->getTraceAsString(). "\r\n" . $e->getMessage());
  12.         fclose($fo);
  13.     }
  14.  
  15.     protected function setException(Exception $e){
  16.         $this->getCode = $e->getCode();
  17.         $this->getMessage = $e->getMessage();
  18.         $this->statusEx = true;
  19.     }
  20.  
  21.     public function getException(){
  22.         $this->msj[] = '<div class="alert alert-error">
  23.                Error número: ' .$this->getCode. '</br>
  24.                Mensaje: '.$this->getMessage.'</div></br>';
  25.         return $this->msj;
  26.     }
  27.  
  28.     public function getStatus(){
  29.         return $this->statusEx;
  30.     }
  31.  
  32. }
  33. ?>

init.php

Código PHP:
Ver original
  1. require 'classes/sesion.class.php';
  2. require 'classes/general.php';
  3. require 'classes/bcrypt.php';
  4. $sesion     = new Sesion();


sesion.class.php

Código PHP:
Ver original
  1. <?php
  2. require_once('core/connect/database.class.php');
  3. class Sesion extends Database{
  4.  
  5.     public function __construct(){
  6.         $this->db = new Database('127.0.0.1', 'root', '', 'lar');
  7.     }  
  8. }
  9.  
  10. ?>

en la página login.php tengo esto:

Código PHP:
Ver original
  1. if($sesion->getStatus() == true){
  2.             echo implode($sesion->getException());
  3.         }

Antes si me mostraba el mensaje, pero ahora ya no, y lo necesito para controlar lo mejor posible los errores mientras termino el proyecto.

Etiquetas: acuerdo, mysql, nivel, registro, registros, usuario, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:31.