php - Zend Auth y ACL
zend-framework authentication (4)
Recomiendo el libro "Zend Framework in Action" de Manning Publications como una gran introducción actualizada a esto. Está disponible como descarga de PDF, para que pueda tenerlo ahora :)
Pero para responder a esta pregunta en particular:
Comencemos por definir dos términos clave. La "Auth" en Zend_Auth se refiere a la Autenticación, que prueba que alguien es quien dice ser (es decir, iniciar sesión). La "A" en Zend_Acl se refiere a la Autorización, que prueba que alguien tiene el derecho de hacer lo que está tratando de hacer (es decir, control de acceso).
Suponiendo que el usuario tiene un solo rol ... Almacene los roles del usuario en la "identidad" que obtiene como parte de Zend_Auth. Al iniciar sesión:
$auth = Zend_Auth::getInstance();
$identity = new stdClass();
$identity->user_pk = $user->getPrimaryKey();
$identity->user_name = $user->getName();
$identity->role = $user->getRole(); // select * from user_role where user_pk=xxx
$auth->getStorage()->write($identity);
En el controlador:
$acl->add(new Zend_Acl_Resource(''news''))
->allow(''defaultRole'', ''news'');
Todo está denegado por defecto, por lo que realmente no necesita especificar:
->deny(''defaultRole'', ''news'', ''add'');
Más adelante en el código del Controlador:
$identity = Zend_Auth::getInstance()->getIdentity();
if(!$acl->isAllowed($identity->role, ''news'', ''add''))
{
header(''Location: http://www.yoursite.com/error/unauthorized'');
}
Si la identidad del usuario no puede hacer "news-> add", los redirigirá a la página no autorizada (suponiendo que haya creado dicha página).
Si el usuario tuviera> 1 función, almacenaría una matriz de roles en su identidad. Entonces su cheque sería algo como esto:
$identity = Zend_Auth::getInstance()->getIdentity();
$isAllowed = false;
foreach($identity->role as $role)
{
if($acl->isAllowed($role, ''news'', ''add''))
{
$isAllowed = true;
}
}
if(!$isAllowed)
{ // if NO ROLES have access, redirect to unauthorized page
header(''Location: http://www.yoursite.com/error/unauthorized'');
}
Espero que ayude.
Espero que algunos puedan ayudarme un poco, actualmente estoy desarrollando mi primer sitio usando un framework de PHP, parte del sitio se derrama en un área para miembros, aquí es donde mi confusión comienza a emerger, dentro del área de miembros que quiero normal miembros para poder agregar nuevos comentarios y editar sus propios comentarios, lo suficientemente simple como para poder verificar el nombre de los carteles contra el nombre de usuario que está almacenado en la sesión, mi confusión viene con la diferenciación entre los usuarios ''normales'' y los usuarios de nivel superior que tienen la capacidad de eliminar y modificar los comentarios, etc., también deberían poder acceder a la sección de administración del sitio.
Mi pregunta es: ¿todos los usuarios deben iniciar sesión a través del mismo controlador Zend_Auth, o deben haber controladores separados que usan Zend_Auth para cada tipo de usuario o se puede tratar todo eso con Zend_Acl? Cualquier ayuda, consejo, artículo o tutorial sería muy apreciado. Personalmente, creo que la documentación de Zend es un poco cruda en algunas clases.
Gracias por adelantado
sico87
Sí, en la mayoría de los casos, toda la autenticación debe pasar por el mismo controlador. Sin embargo, Zend Auth no es un tipo de controlador. Zend Auth es una API para utilizar métodos de autenticación comunes, como una base de datos o http. Su trabajo es realmente ser una envoltura alrededor del arduo trabajo de escribir código de autenticación.
Zend Acl es lo que está buscando para distinguir entre usuarios normales y usuarios privilegiados. Solo implica a Zend Acl después de que los usuarios se hayan autenticado y hayan iniciado sesión.
La mayoría de lo que necesita está en la documentación de ZF. Leí casi toda la documentación de Auth y Acl antes de que tuviera mucho sentido para mí. Aunque Auth, ACL, Storage_ * de ZF y otras clases se usan muy juntas, todas tienen propósitos muy distintos. Con un poco de tiempo verás que se complementan muy bien.
Un par de enlaces para que comiences:
Puedo entender por qué te confundes. Estaba / todavía estoy un poco confundido. Por lo tanto, desafortunadamente no puedo responder su pregunta directamente. Pero, una cosa que estoy haciendo para aclarar todo esto en mi cabeza es pensar en términos de ''objetos de dominio'' en oposición a los registros de la base de datos.
Mi táctica para lidiar con este problema es crear mi propio Auth Adapter al que se le pasa un ''Usuario Base Object'' junto con las credenciales del usuario. Mi ''Base de usuario'' es como un repositorio de usuarios.
Así que Zend Auth queda como ''una interfaz'' para otros Zend Components mientras que aún tengo un poco más de control sobre mi sistema para almacenar y acceder a ''Usuarios''. Mi clase User_Base podría ser un contenedor alrededor de un Zend Db tbl o incluso tener algún código difícil que pueda usar para las pruebas.
Entonces, en general-
diseña tu propio modelo de ''usuario''
diseñe su propio adaptador de autenticación, comenzando con la interfaz mínima requerida como se describe aquí: http://framework.zend.com/manual/en/zend.auth.html
y mantén todo simple e ir despacio a medida que aprendes más sobre él.
bueno, eso es lo que voy a hacer de todos modos.
Ni siquiera voy a molestarme con Zend ACL hasta que tenga Auth claro en mi cabeza.
Estoy renovando un sitio heredado y convirtiéndolo en Zend MVC
Estas son algunas cosas (quizás no convencionales) con las que tuve que lidiar para que mi ''modelo'' funcionara. :
- una aplicación puede ser utilizada por los usuarios desde múltiples ''bases de usuarios'' - openID, tabla de usuarios heredados, tabla de nuevos usuarios, huéspedes fugaces, etc.
- la identidad de un invitado puede ser simplemente un hash creado cuando llegan por primera vez
- mientras que la identidad de un usuario heredado podría estar representada por una identificación en la tabla de usuarios heredados
- los usuarios y user_accounts son cosas separadas. no intente mezclarlos en un solo concepto porque podría complicarse.
- puede haber muchos tipos diferentes de cuentas en el sistema. Es decir cuentas de los compradores contra cuentas de los vendedores. Readers_Account versus Writers_Account
- cuentas ''tener'' usuarios - ''titular de la cuenta principal'', ''superusuario administrador'', etc.
- la relación entre los usuarios y una cuenta está representada por, por ejemplo, ''account_users'' (un subconjunto local de todos los usuarios en todas las bases de usuarios)
- los roles están adjuntos a account_users (los usuarios de esa cuenta en particular). (A diferencia de los roles que flotan)
- no tengas miedo de tener más de una aplicación Zend en un servidor para representar un sitio web, por ejemplo, aplicación de administrador, aplicación de miembros, aplicación de front-end.
- no tema dejar que estas aplicaciones usen objetos modelo almacenados en la carpeta ''modelos compartidos'', con el único código modelo que se relaciona directamente con la aplicación individual ubicada en las carpetas / application / models / foomodel.
- cada aplicación puede tener su propio adaptador de autenticación personalizado
- un adaptador de autenticación de administrador solo puede permitir a los usuarios de la "tabla de usuarios administradores" mientras que el adaptador de autenticación de una aplicación de front-end podría autenticar usuarios de la base de usuarios invitados, el personal o la base de usuarios de miembros.
- podría ser un caso específico en el que la sesión de aplicaciones de usuario final se borre y se replique por sesión miembro al elevarse cuando el miembro inicie sesión.
- un objeto de usuario por aplicación por cliente web en cualquier momento (en lugar de tratar de hacer referencia a una persona con un usuario invitado Y un usuario miembro, eso es demasiado complicado)
- una sesión por usuario por aplicación (espacio de nombres para evitar conflictos con otras aplicaciones en las que pueden iniciar sesión en ese dominio) - (en lugar de tratar de referirse simultáneamente a "la persona que lo usa" con una sesión de invitado Y una sesión de miembro. eso es muy complicado
ok, estoy empezando a divagar ... pero entiendes la idea. No permita que los tutoriales de Zend_Auth + Zend Db que vea influyan en su propio modelo. son solo ejemplos simplificados.
dijo Nuff
Tengo algunas preguntas sobre este pedazo de código
$auth = Zend_Auth::getInstance();
$identity = new stdClass();
$identity->user_pk = $user->getPrimaryKey();
$identity->user_name = $user->getName();
$identity->role = $user->getRole(); // select * from user_role where user_pk=xxx
$auth->getStorage()->write($identity);
$identity = Zend_Auth::getInstance()->getIdentity();
¿User_pk, user_name y role están almacenados como cookies? ¿Alguien que hace una cookie con el nombre de rol podrá acceder a las partes aseguradas de los sitios web? ¿No debería una contraseña (con md5-encryption) ser parte de la identificación así que cuándo puede verificar el nombre de usuario y la contraseña con cada solicitud?