7.5 角色

在大多数系统中,用户都是属于一个或多个组的(也即扮演一个或多个角色)。用户的身份不会发生变化,但是他在系统中可能需要扮演一个新的角色、退出某个角色或是扮演多个角色。Solar_Role系列类能帮助你查找当前用户在系统中的身份。

与验证适配器一样,我们不需要自己去实例化一个角色对象;已注册的Solar_User对象会自动建立一个$role属性。

7.5.1 适配器

Solar提供不同的适配器帮助你从不同的后端找出用户角色信息。Solar现有的适配器如下:

[Note]Note

注意,这些适配器都是只读的。它们不会为你管理和创建用户角色分配,它们仅仅查找用户属于哪种角色。

用户验证后的身份在登陆期间是不会发生变化的。但是,用户的角色在同一次会话中可能会发生变化;例如,登陆后,用户被提示身份由版主变为作者。因为这个原因,所以角色适配器在每次加载新页面时都会从存储后端重新读取用户角色。

Solar使用Solar_Role工厂类实例化适配器,所以你需要在配置文件中指定你在系统中想使用的适配器。你可以这样配置:

<?php
$config['Solar_Role'] = array(
    'adapter'    => 'Solar_Role_Adapter_Sql',
);

7.5.2 适配器配置

现在我们已经告诉工厂类要实例化哪个适配器了,我们还需要配置适配器本身。角色适配器比验证适配器容易配置得多,但是每个适配器有自己独有的配置。你可以点击下面的链接查看它们各自需要的配置。

例如,一个使用“roles数据表,用户名字段为handle,用户分配的角色字段为name”的SQL角色适配器的配置如下:

<?php
$config['Solar_Role_Adapter_Sql'] = array(
    'table'      => 'roles',
    'handle_col' => 'handle',
    'role_col'   => 'name',
);

7.5.3 使用方法

假设我们使用SQL角色适合器从数据表roles中获取角色信息。roles表中信息如下:

# table: roles
handle      name
--------    ----------
bolivar     admin
andy        editor
sarah       editor
andy        author
jameel      author
kornblum    moderator

我们再假设用户'andy'已经登陆了。Solar_User对象内部含有Solar_Role_Adapter实例,所以当我们实例化它后,它会自动连接到数据库并从中获取用户'andy'的角色信息。之后我们可以使用Solar_Role_Adapter的方法找出'andy'在系统中的角色信息。(别忘了,我们使用的是Solar_User对象,而不需要单独实例化一个角色适配器。)

<?php
$user = Solar_Registry::get('user');

// what is the list of andy's roles?
$list = $user->role->getList(); // array('editor', 'author')

// is andy an admin?
$is_admin = $user->role->is('admin'); // false

// is andy in any (at least one) of these roles?
$user->role->isAny(array('moderator', 'author', 'admin')); // true

// is andy assigned all of these roles?
$user->role->isAll(array('editor', 'author')); // true