php - started - Mejores prácticas de Zend_Auth
zend framework manual (3)
No estoy seguro de si esta es la mejor práctica, pero si tuviera que implementar lo que busca, haré lo siguiente:
- Cree un
LoginForm
con un botón de envío de identificación única (explicado más adelante) - Cree un
AuthService
con métodosgetLoginForm
,login
logout
,logout
y uno o todos:getIdentity
,hasIdentity
y métodos similares. - Cree un asistente de visualización que tenga una instancia de este servicio, y dependiendo de cuál sea el resultado de
hasIdentity
, represente el Formulario de inicio de sesión o represente la identidad del usuario que inició sesión en las vistas que necesitan esta funcionalidad. - Cree un complemento de controlador frontal que también tenga una instancia del servicio e implemente el
preDispatch
complementopreDispatch
. Dale una configuración de qué acciones sondear. SiAuthService->hasIdentity()
devuelve verdadero, no haga nada. Si la solicitud es una solicitud posterior, busque el nombre único del botón de envío identificable, es decir:$request->getPost( ''loginSubmitButton'', null );
predeterminado anull
si no está disponible. Si no esnull
,login( $request->getPost() )
en el servicio. Si tiene éxito, redirija a la misma acción, si no se completa correctamente y vuelva a mostrar el formulario en el dispositivo de visualización (que muestra los errores de forma automática).
El servicio puede ser recuperado tanto por viewhelper como por el complemento del controlador frontal con algún localizador de servicios haciendo algo como ServiceAbstract::getService( ''Auth'' )
registrando el servicio en ServiceAbstract
en el arranque.
Mi objetivo es exigir el inicio de sesión para ciertas páginas. Estoy usando Zend Framework MVC, y estoy tratando de encontrar ejemplos con respecto a las mejores prácticas.
Algunas notas sobre lo que estoy buscando:
- Quiero que los usuarios que no hayan iniciado sesión obtengan un cuadro de inicio de sesión y luego regresen a la versión de inicio de sesión de la página, una vez autenticado
- Deseo usar inyección de dependencia y evitar singletons
- Huella de código pequeño: vincule a la estructura Zend mvc
- ¿Debería el cuadro de inicio de sesión ser un controlador por separado y redireccionar el encabezado? ¿Cómo regresar a la página de destino después del éxito de la autenticación? ¿Una idea para simplemente llamar a la acción del controlador de inicio de sesión para mostrar el cuadro de inicio de sesión en la página de destino, o es una desventaja con respecto a la indexación del motor de búsqueda?
- Poder usar una biblioteca externa para manejar cookies
O algo completamente diferente. Soy bastante nuevo en el marco de Zend, y quiero hacerlo ''de la manera correcta''.
Podría usar la combinación de Zend_Auth y Zend_Acl . Para ampliar las otras respuestas, doy un breve ejemplo de cómo puede administrar la autenticación utilizando Zend Framework:
Primero necesita configurar un complemento para predispatch todas las solicitudes y comprobar si el cliente puede acceder a ciertos datos. Este plugin puede verse como este:
class Plugin_AccessCheck extends Zend_Controller_Plugin_Abstract {
private $_acl = null;
public function __construct(Zend_Acl $acl) {
$this->_acl = $acl;
}
public function preDispatch(Zend_Controller_Request_Abstract $request) {
//get request information
$module = $request->getModuleName ();
$resource = $request->getControllerName ();
$action = $request->getActionName ();
try {
if(!$this->_acl->isAllowed(Zend_Registry::get(''role''),
$module . '':'' . $resource, $action)){
$request->setControllerName (''authentication'')
->setActionName (''login'');
}
}catch(Zend_Acl_Exception $e) {
$request->setControllerName(''index'')->setActionName (''uups'');
}
}
}
Entonces, cada tipo de usuario tiene ciertos permisos que usted define en su biblioteca de acl. En cada solicitud, verifica si el usuario tiene permiso para acceder a un recurso. Si no, redirecciona a la página de inicio de sesión, de lo contrario, el preDispatch pasa al usuario al recurso.
En Zend_Acl usted define roles, recursos y permisos, que permiten o niegan el acceso, por ejemplo:
class Model_LibraryAcl extends Zend_Acl {
public function __construct() {
$this->addRole(new Zend_Acl_Role(''guests''));
$this->addRole(new Zend_Acl_Role(''users''), ''guests'');
$this->addRole(new Zend_Acl_Role(''admins''), ''users'');
$this->add(new Zend_Acl_Resource(''default''))
->add(new Zend_Acl_Resource(''default:authentication''), ''default'')
->add(new Zend_Acl_Resource(''default:index''), ''default'')
->add(new Zend_Acl_Resource(''default:error''), ''default'');
$this->allow(''guests'', ''default:authentication'', array(''login''));
$this->allow(''guests'', ''default:error'', ''error'');
$this->allow(''users'', ''default:authentication'', ''logout'');
}
}
Luego debes configurar acl y auth en tu archivo bootstrap:
private $_acl = null;
protected function _initAutoload() {
//...your code
if (Zend_Auth::getInstance()->hasIdentity()){
Zend_Registry::set (''role'',
Zend_Auth::getInstance()->getStorage()
->read()
->role);
}else{
Zend_Registry::set(''role'', ''guests'');
}
$this->_acl = new Model_LibraryAcl ();
$fc = Zend_Controller_Front::getInstance ();
$fc->registerPlugin ( new Plugin_AccessCheck ( $this->_acl ) );
return $modelLoader;
}
Finalmente, en su controlador de autenticación debe usar un adaptador de autenticación personalizado y las acciones de configuración para iniciar y cerrar sesión:
public function logoutAction() {
Zend_Auth::getInstance ()->clearIdentity ();
$this->_redirect ( ''index/index'' );
}
private function getAuthAdapter() {
$authAdapter = new Zend_Auth_Adapter_DbTable (
Zend_Db_Table::getDefaultAdapter ());
$authAdapter->setTableName(''users'')
->setIdentityColumn(''email'')
->setCredentialColumn (''password'')
->setCredentialTreatment (''SHA1(CONCAT(?,salt))'');
return $authAdapter;
}
En su acción de inicio de sesión, debe pasar los datos de inicio de sesión al adaptador de autenticación que realiza la autenticación.
$authAdapter = $this->getAuthAdapter ();
$authAdapter->setIdentity ( $username )->setCredential ( $password );
$auth = Zend_Auth::getInstance ();
$result = $auth->authenticate ( $authAdapter );
if ($result->isValid ()) {
$identity = $authAdapter->getResultRowObject ();
if ($identity->approved == ''true'') {
$authStorage = $auth->getStorage ();
$authStorage->write ( $identity );
$this->_redirect ( ''index/index'' );
} else {
$this->_redirect ( ''authentication/login'' );
}
Y eso es todo. Te recomiendo este HOW TO en youtube en zend auth y zend acl.
- Quiero que los usuarios que no hayan iniciado sesión obtengan un cuadro de inicio de sesión y luego regresen a la versión de inicio de sesión de la página, una vez autenticado
Use un complemento FrontController y redirigirlos o reenviarlos a su loginAction.
- Deseo usar inyección de dependencia y evitar singletons
Zend Framework, actualmente no envía ningún sistema DI, sin embargo, Zend_Application_Resource_ * en realidad lo reemplaza. ¿Qué tipo de dependencia necesitarías aquí?
- Huella de código pequeño: vincule a la estructura Zend mvc
Eso depende de usted.
- ¿Debería el cuadro de inicio de sesión ser un controlador por separado y redireccionar el encabezado? ¿Cómo regresar a la página de destino después del éxito de la autenticación? Una idea para simplemente llamar a la acción del controlador de inicio de sesión para mostrar el cuadro de inicio de sesión en la página de destino, o es una desventaja con respecto a la indexación del motor de búsqueda?
Uso principalmente un AuthController
especial con LoginAction
& LogoutAction
. Para redirigir al usuario a la página que estaba tratando de ver, siempre agrego un elemento returnUrl
en mis formularios, e returnUrl
el valor de la URL solicitada para poder redirigir al usuario, y si no, lo redirecciono al índice / tablero de instrumentos, depende.
- Poder usar una biblioteca externa para manejar cookies
Zend_Auth le permite configurar su propio mecanismo de almacenamiento , así que simplemente implemente la interfaz.
$auth = Zend_Auth::getInstance();
$auth->setStorage(new My_Auth_Storage());
Pero nunca almacenar el resultado de autenticación en una cookie, es muy fácil modificarlo y acceder a su sitio web.
También puedes echarle un vistazo a una de mis respuestas anteriores .