Estoy trabajando con una clase PHP que hace ACL en mi aplicación web. Está basado en controladores y en realidad solo funciona con una matriz de configuración. Quiero migrar esta matriz a un esquema MySQL para hacer un controlador. Esta es la matriz de configuración real:

$config = array(

    /**
     * Groups as id => array(name => <string>, roles => <array>)
     */
    'groups' => array(
        -1  => array('name' => 'Banned', 'roles' => array('banned')),
        0   => array('name' => 'Guests', 'roles' => array()),
        1   => array('name' => 'Users', 'roles' => array('user')),
        50  => array('name' => 'Moderators', 'roles' => array('user', 'moderator')),
        100 => array('name' => 'Administrators', 'roles' => array('user', 'moderator', 'admin')),
    ),

    /**
     * Roles as name => array(location => rights)
     */
    'roles' => array(
        '#'          => array('website' => array('read')), // default rights
        'banned'     => false,
        'user'       => array('comments' => array('create', 'read')),
        'moderator'  => array('comments' => array('update', 'delete')),
        'admin'      => array(
            'website'  => array('create', 'update', 'delete'),
            'admin'    => array('create', 'read', 'update', 'delete'),
        ),
        'super'      => true,
    ),

);

Esto es lo que he estado pensando:

MySQL schema

Esto me permitió asociar roles a los grupos existentes, así que resolví lo primero. Lo que no sé cómo agregar son las ubicaciones y los derechos de cada función. Obviamente, irá a una tabla separada con una relación con un role_id, pero ¿cuál es la mejor manera de reproducir algo como: array('comments' => array('update', 'delete'))?

Por último, si un rol tiene un valor booleano (como rol prohibido o rol super), significa que todo es verdadero o todo falso. Probablemente esto se ajuste más a los roles. ¿No?

¡Gracias de antemano!

1
udexter 20 feb. 2012 a las 11:33

1 respuesta

La mejor respuesta

¿Qué te parece esto?

roles_has_access
-----
role_id FK
location_id FK
right_id FK

locations
-----
id PK
name
-- ?
-- whatever resources/locations you have here (website, admin, comments)

rights
-----
id PK
name
-- `CREATE`, `UPDATE`, `DELETE`, `READ` etc.
1
bububaba 20 feb. 2012 a las 12:49