Red de conocimiento informático - Problemas con los teléfonos móviles - Cómo utilizar la clase de autenticación de autoridad Thinkphp

Cómo utilizar la clase de autenticación de autoridad Thinkphp

El ejemplo de autenticación de autoridad de ThinkPHP explica en detalle el ejemplo de autenticación de autoridad de ThinkPHP.

Este artículo utiliza un código de muestra para analizar en profundidad los principios y métodos de implementación de la autenticación de autoridad de ThinkPHP. Los pasos específicos son los siguientes:

mysql El código SQL de la parte de la base de datos 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 5960 616263646566676869707172 ----------------------------- -- estructura de tabla de think_auth_group ----- ----------------------- BOTAR TABLA SI EXISTE `think_auth_group` CREAR TABLA `think_auth_group` ( `id` mediumint; (8) unsigned NOT NULL AUTO_INCREMENT, ` title` char(100) NOT NULL DEFAULT '', `status` tinyint(1) NOT NULL DEFAULT '1', `reglas` char(80) NOT NULL DEFAULT '', CLAVE PRIMARIA (`id`) )ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='Tabla de grupos de usuarios' ------------------------ ---- -- registros think_auth_group ------------------------------- INSERTAR EN VALORES `think_auth_group` ('1', 'Grupo de administración', '1', '1,2'); ----------------------------- -- estructura de la tabla de think_auth_group_access ----- ----------------------- BOTAR TABLA SI EXISTE `think_auth_group_access` CREAR TABLA `think_auth_group_access` ( `uid` mediumint; (8) COMENTARIO NOT NULL sin firmar 'id de usuario', `id_grupo` mediumint(8) COMENTARIO NO NULO sin firmar 'id de grupo de usuarios', CLAVE ÚNICA `uid_group_id` (`uid`,`id_grupo`), CLAVE `uid` (` uid`), KEY `group_id` ( `group_id`) )ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Detalles del grupo de usuarios' --------------------- ---------- - -- registro de think_auth_group_access -- --------------- ------------- INSERTAR EN `think_auth_group_access ` VALORES ('1', '1'); INSERTAR EN `think_auth_group_acce

ss` VALORES ('1', '2'); -- ------------- --------------- -- estructura de tabla de think_auth_rule - - ---------------------------- BOTAR TABLA SI EXISTE `think_auth_rule`; CREAR TABLA `think_auth_rule` (`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, `name` char(80) NOT NULL DEFAULT '' COMMENT 'El identificador único de la regla', `title` char(20) NOT NULL DEFAULT '' COMMENT 'El nombre chino de la regla', ` status` tinyint (1) NOT NULL DEFAULT '1' COMMENT 'Estado: 1 normal, 0 deshabilitado', `type` char(80) NOT NULL, `condition` char(100) NOT NULL DEFAULT '' COMMENT 'Expresión regular, representación vacía Verifique si existe, no vacío significa verificar según las condiciones', PRIMARY KEY (`id`), UNIQUE KEY `name` (`name`) )ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COMMENT='Regla tabla'; ----------------------------- -- registro de think_auth_rule -- ---------- ----- ------------- INSERTAR EN VALORES `think_ auth_rule` ('1', 'Inicio/índice', 'lista', '1', 'Inicio', '' ); INSERTAR EN VALORES `think_auth_rule` ('2', 'Inicio/agregar', 'agregar', '1', 'Inicio', ''); INSERTAR EN VALORES `think_auth_rule` ('3', 'Inicio/editar); ', 'editar', '1', 'Inicio', ''); INSERTAR EN VALORES `think_auth_rule` ('4', 'Inicio/eliminar', 'eliminar', '1', 'Inicio', '') ; BORRAR TABLA SI EXISTE `think_user`; CREAR TABLA `think_user` ( `id` int(11) NOT NULL, `username` varchar(30) DEFAULT NULL, `contraseña` varchar(32) DEFAULT NULL, `age` tinyint( 2) NULO POR DEFECTO, CLAVE PRIMARIA (`id`)) MOTOR = InnoDB CHARSET POR DEFECTO = utf8 -- ---------------------------; - -- Registro Think_user ------------------------------- INSERTAR EN VALORES `think_user` ('1', 'admin' , '21232f297a57a5a743894a0e4a801fc3', '25'

Archivo de configuración Application\Comm

sección on\Conf\config.php: 12345678910111213141516171819202122 'Valores de configuración' 'DB_ DSN' => '', // Conexión de base de datos DSN del método PDO 'DB_TYPE' => 'mysql', // Tipo de base de datos 'DB_HOST' => 'localhost', // Dirección del servidor 'DB_NAME' => 'thinkphp', // Nombre de la base de datos 'DB_USER' => ' => 'root', // Contraseña 'DB_PORT' => 3306, // Puerto 'DB_PREFIX' => 'think_', // Prefijo de la tabla de base de datos 'AUTH_CONFIG' => array( 'AUTH_ON' => true, // Interruptor de autenticación 'AUTH_TYPE' => 1, // Método de autenticación, 1 significa autenticación por hora; 2 significa autenticación de inicio de sesión 'AUTH_GROUP' => 'think_auth_group', // Nombre de la tabla de datos del grupo de usuarios 'AUTH_GROUP_ACCESS' => 'think_auth_group_access', // Detalles del grupo de usuarios 'AUTH_RULE' => 'think_auth _rule', // Tabla de reglas de permisos 'AUTH_USER' => 'think_user' // Tabla de información del usuario

Controlador de la página de inicio del proyecto Parte de Application\Home\Controller); \IndexController.class.php código: 123456789101112131415161718192021222324 check($nombre, $uid, $tipo, $modo, $relación)) { morir('Autenticación: Éxito' } else { morir('Autenticación: Fallo'); p> Arriba hay un ejemplo de código de autenticación básico.

El siguiente es el código fuente legible:

1. Información de configuración de inicialización de la clase de verificación de permisos: 1 $Auth = new\Think\Auth(); El programa fusiona la información de configuración al crear el objeto

El programa fusiona la información de configuración en la matriz Application\Common\Conf\config AUTH_CONFIG en .php. php 1234567891011 función pública __construct() { $prefijo = C('DB_PREFIX'); $this->_config['AUTH_GROUP'] = $prefijo . AUTH_RULE'] = $prefix .$this->_config['AUTH_RULE'];$this->_config['AUTH_USER'] = $prefix .{ // Se puede configurar el elemento de configuración AUTH_CONFIG, que es una matriz. $this->_config = array_merge($this->_config,C('AUTH_CONFIG'));}.

}

2. Verificar permisos: 1 cheque($nombre, $uid, $tipo = 1, $modo = 'url', $ relación = 'o')

Análisis general Este método

Primero determine si la verificación de permisos está desactivada. Si la información de configuración AUTH_ON=>es falsa, no se realizará la verificación de permisos. De lo contrario, la verificación de permisos continuará 123 si (!$this-. >_config['AUTH_ON']) { Return true; }

Luego, se obtendrá la lista de permisos en detalle: 1 $authList = $this->getAuthList($uid, $type

Esta vez, convierta la lista de reglas de verificación en una matriz: 12345678 if (is_string($name)) { $name = strtolower($name); if (strpos($name, ',') !== false) { $nombre = explode(',', $nombre } else { $nombre = array($nombre }}

Por lo tanto, el parámetro $nombre no distingue entre mayúsculas y minúsculas; eventualmente se convertirá a minúsculas:

Cuando el modo URL está activado, todos los parámetros se convertirán a minúsculas: 123 if ($ mode == 'url') { $REQUEST = unserialize(strtolower(serialize($ _REQUEST))); } }

Uno de los fragmentos de código principales de verificación de permisos Uno, es decir, 12345678910111213 foreach ($authList as $auth) { $query = preg_replace('/^. +\? /U', '', $auth);//obtener parámetro de URL if ($mode == 'url ' && $query! = $auth) { parse_str($query, $param); //obtener parámetros de URL en matriz; form $intersect = array_intersect_assoc($REQUEST, $param); $auth = preg_replace('/\?*$ /U', '', $auth); //obtiene el archivo URL para acceder if (in_array($auth, $nombre) && $intersect == $param) { //si los nodos coinciden y el parámetro de URL se cumple $list[] = $auth } else if (in_array($auth, $name) && $intersect == $ param) { //si los nodos coinciden y el parámetro de URL se cumple $list[] = $auth; } } else if (in_array( $auth, $name)) { $list[] = $auth; /p>

in_array($auth, $name) Si un permiso en la lista de permisos es igual a los permisos actuales a verificar, agréguelos a $list

Nota: 12345678910111213 $list = array (); // Guarda el nombre de la regla verificada if ($relation == 'o' y ! vacío($li

st)) { devolver verdadero } $diff = array_diff($nombre, $lista); if ($relación == 'y' y vacío($ diff)) { devolver verdadero; vacío($lista); // Cuando se usa o, siempre que uno de ellos pase, el permiso es verdadero $relación == 'y' y vacío($diff); // Cuando se usa y, $nombre y $ list son completamente iguales, entonces el permiso es verdadero

3. Obtenga la lista de permisos: 1 $authList = $this->getAuthList($uid, $type); que el usuario necesita verificar

Este es el proceso principal:

Obtener el grupo de usuarios 12 $groups = $this- >getGroups($uid); //SELECT `rules` FROM); think_auth_group_access a INNER JOIN think_auth_group g en a.group_id= g.id WHERE ( a.uid='1' and g. status='1' )

La operación simplificada es: 1 SELECT `rules` FROM think_auth_group WHERE STATUS = '1' AND id=' 1' //Ir en línea a la tabla think_auth_group_access en el flujo normal es un poco redundante....

!

Obtiene el campo de regla del grupo de usuarios. Este campo guarda la identificación de la tabla de reglas think_auth_rule y la divide.

$ids es la matriz de identificación en la que finalmente se convierte la variable $groups. : 12345 $ map = array( 'id' => array('in', $ ids), 'type' => $type, 'status' => 1,

Obtener la información de la regla; en la tabla think_auth_rule y luego recorra: 123456789101112131415 foreach ($rules as $rule) { if (!empty($rule['condition'])){ // Verificar según las condiciones $user = $this->getUserInfo( $uid); // Obtener información del usuario, matriz unidimensional $command = preg_replace('/\{(\w*?) \}/','$user[\'\1\']',$rule[ 'condición']); //dump($comando);//debug @(eval('$condición=(' . $comando . ');'); if ($condición) { $authList[] = strtolower( $regla['nombre' ]); }}} else { //registra $authList[] siempre que exista $authList[] = strtolower($regla['nombre']); ($ regla['condición '])){ // Verificar según las condiciones

Aquí está muy claro, getUserInfo irá al nombre de la tabla correspondiente en el archivo de configuración AUTH_USER para buscar información del usuario

El punto clave es: 12 $comando = preg_replace(' /\{(\w*?) \}/', '$usuario[\'\1\']', $regla['condición'] ); @(eval('$ condition=(' . $command . ');');

'/\{(\w*?) \}/ Se puede entender que el texto a ser coincidente es {cadena}.

Entonces {string} será reemplazado por $user['string']

$command =$user['string']

If 12345 $rule['condition'] = ' {edad}'; $comando =$usuario['edad'] $regla['condición'] = '{edad}'; $comando =$usuario['edad'] $regla['condición'] =$usuario[ 'edad'] $regla['condición']; $comando =$usuario[' .'edad'] $ regla['condición'] = '{edad} > 5'; $comando =$usuario['edad'] > 10 @(eval('$condición=(' .$comando . ');');

Eso es 1 $condition=($user['age'] > 10);

En este momento, verifique el siguiente código nuevamente. Si es verdadero, agréguelo como autorización. list 123 if ($condition ) { $authList[] = strtolower($rule['name'] }

En este punto, verifique el siguiente código. Si es verdadero, agréguelo como. la lista de autorización 123 if ($condition) { $ authList[] = strtolower($rule[ 'name'] } 123

);