PHP - Variables de sesion con roles, PDO

 
Vista:
sin imagen de perfil

Variables de sesion con roles, PDO

Publicado por Alberto (11 intervenciones) el 04/05/2017 08:45:59
Buenos dias tengo un sitio web redirigido por variables de sesion que funcionan perfectamente, el problema es, que quiero indicar roles, unicamente con invitado y admin me valdria.

En estos momentos pasan todos los usuarios logueados, y si no lo detecta logueado no deja pasar a la URL, pues ahroa bien necesito hacer la smodificaciones necesarias para que detecte si es invitado o admin y siendo uno u otro vaya a una URL diferente.

Usuario.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?php
	/*
	*
	*
	*/
	class Usuario{
		private $id;
		private $nombre;
		private $clave;
                private $access_level;
 
                public function getaccess_level(){
			return $this->access_level;
		}
 
		public function setaccess_level($nivel){
			$this->access_level = $access_level;
		}
 
		public function getId(){
			return $this->id;
		}
 
		public function setId($id){
			$this->id = $id;
		}
 
		public function getNombre(){
			return $this->nombre;
		}
 
		public function setNombre($nombre){
			$this->nombre = $nombre;
		}
 
		public function getClave(){
			return $this->clave;
		}
 
		public function setClave($clave){
			$this->clave = $clave;
		}
	}
?>

Imagino que aqui arriba se deberia de declarar dos variables para la busqueda del rol.

crud_usuario.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<?php
	require_once('conexion.php');
	require_once('usuario.php');
 
	class CrudUsuario{
 
		public function __construct(){}
 
		//inserta los datos del usuario
		public function insertar($usuario){
			$db=DB::conectar();
			$insert=$db->prepare('INSERT INTO USERS VALUES(NULL,:nombre, :clave,"")');
			$insert->bindValue('nombre',$usuario->getNombre());
			//encripta la clave
			$pass=password_hash($usuario->getClave(),PASSWORD_DEFAULT);
			$insert->bindValue('clave',$pass);
			$insert->execute();
		}
 
		//obtiene el usuario para el login
		public function obtenerUsuario($nombre, $clave){
			$db=Db::conectar();
			$select=$db->prepare('SELECT * FROM USERS WHERE nombre=:nombre');//AND clave=:clave
			$select->bindValue('nombre',$nombre);
			$select->execute();
			$registro=$select->fetch();
			$usuario=new Usuario();
			//verifica si la clave es conrrecta
			if (password_verify($clave, $registro['clave'])) {
				//si es correcta, asigna los valores que trae desde la base de datos
				$usuario->setId($registro['Id']);
				$usuario->setNombre($registro['nombre']);
				$usuario->setClave($registro['clave']);
			}
			return $usuario;
		}
 
		//busca el nombre del usuario si existe
		public function buscarUsuario($nombre){
			$db=Db::conectar();
			$select=$db->prepare('SELECT * FROM USERS WHERE nombre=:nombre');
			$select->bindValue('nombre',$nombre);
			$select->execute();
			$registro=$select->fetch();
			if($registro['Id']!=NULL){
				$usado=False;
			}else{
				$usado=True;
			}
			return $usado;
		}
	}
?>

En esta parte donde deberiamos de realizar el select para buscar el rol.

controller_login.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
	require_once('usuario.php');
	require_once('crud_usuario.php');
	require_once('conexion.php');
 
	//inicio de sesion
	session_start();
 
	$usuario=new Usuario();
	$crud=new CrudUsuario();
	//verifica si la variable registrarse está definida
	//se da que está definicda cuando el usuario se loguea, ya que la envía en la petición
	if (isset($_POST['registrarse'])) {
		$usuario->setNombre($_POST['usuario']);
		$usuario->setClave($_POST['pas']);
		if ($crud->buscarUsuario($_POST['usuario'])) {
			$crud->insertar($usuario);
			header('Location: index.php');
		}else{
			header('Location: error.php?mensaje=El nombre de usuario ya existe');
		}
 
	}elseif (isset($_POST['entrar'])) { //verifica si la variable entrar está definida
		$usuario=$crud->obtenerUsuario($_POST['usuario'],$_POST['pas']);
		// si el id del objeto retornado no es null, quiere decir que encontro un registro en la base
		if ($usuario->getId()!=NULL) {
			$_SESSION['usuario']=$usuario; //si el usuario se encuentra, crea la sesión de usuario
			header('Location: indexlogueado.php'); //envia a la página que simula la cuenta
		}else{
			header('Location: error.php?mensaje='); // cuando los datos son incorrectos envia a la página de error
		}
	}elseif(isset($_POST['salir'])){ // cuando presiona el botòn salir
		header('Location: index.php');
		unset($_SESSION['usuario']); //destruye la sesión
	}
?>

En este ha realizado las redirecciones.

Los campos de la tabla users son:
Id, nombre, clave, rol
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de [abZeroX]
Val: 575
Bronce
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Variables de sesion con roles, PDO

Publicado por [abZeroX] (157 intervenciones) el 04/05/2017 23:07:43
Hola, para diferenciar usuarios por roles una solución seria primero que nada contar con una tabla rol la cual tenga los campos
id_rol y rol siendo id_rol PK de dicha tabla y el campo rol sería FK de id_rol en la tabla users (Id, nombre, clave, rol).

EJEMPLO:
ID_ROL - ROL
1 admin
2 invitado

Luego de crear la tabla, en el momento de hacer el registro guardar el rol del usuario.
Para el login, despues de verificar que el usuario y password son correctos, deberias crear una sesion con el rol

1
2
3
4
5
6
7
8
9
10
11
//verifica si la clave es conrrecta
	if (password_verify($clave, $registro['clave'])) {
	//si es correcta, asigna los valores que trae desde la base de datos
	$usuario->setId($registro['Id']);
	$usuario->setNombre($registro['nombre']);
	$usuario->setClave($registro['clave']);
 
        // VARIABLE DE SESION ROL
       session_start();
       $_SESSION['rol'] = $registro['rol'];
}

Por ultimo antes de redirigir al usuario deberás comprobar el rol para saber cual es la página que corresponde
1
2
3
4
5
6
7
8
9
10
11
12
13
if ($usuario->getId()!=NULL) {
	$_SESSION['usuario']=$usuario; //si el usuario se encuentra, crea la sesión de usuario
 
         if ($_SESSION['rol'] == 1) {
                // USUARIO con rol admin
                header('Location: indexlogueado-adim.php');
          } else if ($_SESSION['rol'] == 2) {
               // USUARIO con rol invitado
                header('Location: indexlogueado-invitado.php');
          }
}else{
	header('Location: error.php?mensaje='); // cuando los datos son incorrectos envía a la página de error
}

Espero sirva. Nos comentas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Elivar Largo
Val: 5
Ha aumentado su posición en 24 puestos en PHP (en relación al último mes)
Gráfica de PHP

Variables de sesion con roles, PDO

Publicado por Elivar Largo (2 intervenciones) el 05/05/2017 22:43:01
Algo escalable sería que crees una tabla roles para los roles que tengas(admin, invitado, etc..) y una tabla recursos que guardarrías las páginas de tu sitio Web. Por último crearías una tabla perfiles donde guardarías un rol con su respectivo recurso y obviamente deberías relacionar el rol con la tabla usuarios.

Finalmente para cada usuario verificarías con un select a que recurso puede acceder.

Por cierto el código del login me parece conocido, Saludos....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar