Pregunta

Intenté hacer esto varias veces sin suerte.Despues de leer esta publicación, me interesó en hacer esto nuevamente.Entonces, ¿alguien puede decirme por qué lo siguiente no funciona?

<?php

$guest = 1;
$editor = 2;
$admin = 4;

$user = $editor;

if( $user == ($editor | $admin) ) {
    echo "Test";    
}

?>
¿Fue útil?

Solución

Utilice el operador OR bit a bit (|) para configurar bits, utilice el operador AND (&) para comprobar bits.Tu código debería verse así:

<?php

    $guest = 1;
    $editor = 2;
    $admin = 4;

    $user = $editor;

    if( $user & ($editor | $admin) ) {
        echo "Test";    
    }

?>

Si no entiendes el binario y lo que hacen exactamente los operadores bit a bit, deberías aprenderlo.Entenderás cómo hacer esto mucho mejor.

Otros consejos

Para no reinventar la rueda, ¿por qué no echar un vistazo a los sistemas de autenticación/ACL como Zend ACL y Autenticación Zend?Ambos se pueden utilizar independientemente del Zend Framework en su conjunto.El control de acceso es una situación complicada, por lo que conviene al menos observar cómo lo hacen otros sistemas.

Ha pasado mucho tiempo desde que usé PHP, pero asumiré que esto funcionará:

<?php

    $guest = 1;
    $editor = 2;
    $admin = 4;

    $user = $editor;

    if( ($user == $editor) || ($user == $admin) ) {
        echo "Test";    
    }

?>

Lo he usado para informar errores y funciona bastante bien.En cuanto a los permisos de usuario, debería funcionar muy bien: podría tener varias columnas para cada permiso de usuario en su base de datos o una columna de nivel de usuario en su base de datos.Opta por esta opción.

(2 | 4) se evalúa como 6, pero 2 == 6 es falso.

@mk:(2 | 4) se evalúa como 6.

$guest = 1;
$editor = 2;
$admin = 4;

$user = $editor;

if (user == $editor || $user == $admin) {
    echo "Test";
}

Impresionante, esta parece la mejor manera de otorgar permisos en un CMS.¿Sí?¿No?

Quizás nunca lo he hecho de esa manera.Lo que he hecho es utilizar operadores bit a bit para almacenar un montón de configuraciones de "sí o no" en un solo número en una sola columna de la base de datos.

Supongo que para los permisos, esta forma funcionaría bien si desea almacenar permisos en la base de datos.Si alguien quiere publicar algún contenido y solo quiere que los administradores y editores lo vean, solo tiene que almacenar el resultado de

 ($editor | $admin)

en la base de datos, luego para verificarlo, haga algo como

 if ($user & $database_row['permissions']) {
       // display content
 } else {
       // display permissions error
 }

En mi opinión, esto no escala bien.En realidad, no he intentado usarlo en un proyecto a gran escala, pero un CMS parece demasiado complicado para usarlo.

Siempre depende de lo que necesites.Si ya conoce Zend Framework, apoyaría la sugerencia Zend_Acl/_Auth que se hizo anteriormente.Pero tenga en cuenta que probablemente cada marco venga con un componente similar.

La otra cosa que me viene a la mente es Usuario en vivo.También me gusta mucho trabajar con él.

Creo que puedes hacer prácticamente cualquier cosa y, si bien tu enfoque parece muy simple, también es limitado ya que (a través de todos esos if()) pondrás gran parte de la lógica ACL justo en el medio de tu aplicación.Lo cual no es lo mejor que se puede hacer para mantenerlo simple y extensible.;)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top