Cómo utilizar la clase de autenticación de autoridad 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: p>
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 ); p>
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
);