Access API
权限管理
目录
1.概论
2.怎样定义权限在插件里
3.有用的函数和类
3.1.获取上下文
3.2.确定一个用户有一个给定的权限
3.2.1 是否拥有权限
3.2.2 需要权限才能做
3.3 注册函数
3.4 其他相关函数
3.4.1 需要登录函数
3.4.2 需要课程登陆
3.4.3 是否为访客、登录、站点管理员
3.4.4 是游览、查看、注册
3.4.5 通过权限获取用户
1. 概论
Moodle 是一个基于权限控制的模型. Moodle 的大多数入口(system, users, course categories, courses, modules and blocks) 是通过上下文的目录树来表现的,就像层级调用上下文目录树.角色是设置权限的地方, 任何一种权限都表现为用户可以做什么事. 角色定义在系统上下文的顶层. 角色定义能被重载在较低的上下文里.用户权限控制是通过给用户分配角色来计算的.
所有的该角色的用户不能自动登录通过默认的角色定义在 $CFG->notloggedinroleid中, 他是不可能的去分配角色给不存在的用户id。有一种特殊的角色guest允许用户登录查看. 而且你也不能直接给这些访客用户分配任何角色, 这些账户会自动获得 $CFG->guestroleid . 所有其他通过验证的用户得到默认的角色在 $CFG->defaultuserroleid 和 frontpage 内容 得到指定的角色 $CFG->defaultfrontpageroleid.
2.怎样定义权限在插件里
权限通过 $capabilities 数组 定义 在 db/access.php 文件里. 权限的名字组成是 "plugintype/pluginname:capabilityname".
例如:
$capabilities = array(
'mod/folder:managefiles' => array(
'riskbitmask' => RISK_SPAM,
'captype' => 'write',
'contextlevel' => CONTEXT_MODULE,
'archetypes' => array(
'editingteacher' => CAP_ALLOW
)
),
);
数组中个索引的含义如下:
· riskbitmask - 相关风险.
· captype - read 或者 write 权限类型, 就安全而言,任何写的权限不能赋予给访客和未登录用户。
· contextlevel - 特殊的上下文层级常量,
· archetypes - 特殊的层级定义默认的角色标准层级,初始化的时候是有用的, 升级和重置角色的时候 (注意,你只能在这里使用 CAP_ALLOW ). 层级定义在mdl_role表中
· clonepermissionsfrom - 当你添加一个新的权限,你告诉Moodle去复制这个许可对每一个当前角色.
完整的语法是: 'clonepermissionsfrom' => 'moodle/quiz:attempt',
你必须改变你的版本号在db/access.php改变之后, 一边与升级脚本对数据库做必要的改变. 运行升级脚本, 以管理员身份登录Moodle , 导航到站点首页, 根据说明.
权限命名在插件语言文件里, 名字包含 "pluginname:capabilityname",如下例:
$string['folder:managefiles'] = 'Manage files in folder module';
3. 有用的函数和类
3.1 获取上下文 Context fetching
在插件上下文实例通常只需实例化,因为它们是由系统实例化并自动删除。
获取通过 对象 id:
$systemcontext = context_system::instance();
$usercontext = context_user::instance($user->id);
$categorycontext = context_coursecat::instance($category->id);
$coursecontext = context_course::instance($course->id);
$contextmodule = context_module::instance($cm->id);
获取 实例化通过上下文 id:
$context = context::instance_by_id($contextid);
注意:
· 如果不能创建上下文会抛出默认异常
· 删除用户不再需要任何背景
自2.2以来,多个弃用的上下文相关的函数,没有必要立即更换他们。以下两个函数等价于上下文获取上述例子:
function get_context_instance($contextlevel, $instance = 0, $strictness = IGNORE_MISSING)
function get_context_instance_by_id($id, $strictness = IGNORE_MISSING)
3.2 确定一个用户有一个给定的权限
在实施访问控制总是问“该用户是否有权限做这些事情?”。而不是问“该用户是有在这个地方的角色分配吗?”。
3.2.1 是否拥有权限
has_capability() 是最重要判断权限的函数:
function has_capability($capability, context $context, $user = null, $doanything = true)
检查用户是否有特殊的权限在给定的上下文里. 例如:
$context = context_module::instance($cm->id);
has_capability('mod/folder:managefiles', $context)
默认会检查当前用户的权限, 你也可以给定不同的 userid. 默认会返回true 对 admin 用户, 所以不建议使用 false 的userid在这里.
3.2.2 需要权限才能做
require_capability()
函数 require_capability() 也是非常类似的, 如果用户没有访问权限的话,他会抛出异常.
function require_capability($capability, context $context, $userid = null, $doanything = true, $errormessage = 'nopermissions', $stringfile = '')
3.3 注册函数
略
3.4 其他相关函数
3.4.1 需要登录函数
require_login()
每一个插件脚本应该包含require_login() 或者 require_course_login() 在设置PAGE->url 之后.
这个函数做了如下事情:
· 它会验证用户登录前是否通过了任何课程或活动(未登录的用户不能进入课程).
· 用户是否以访客身份登录
· 验证通过隐藏的课程或能力
· 验证群组成员进入
· 验证用户是否有课程查看权限'moodle/course:view' 或者注册插件给访客的临时权限
· 记录课程访问日志
function require_login($courseorid = NULL, $autologinguest = true, $cm = NULL, $setwantsurltome = true, $preventredirect = false)
3.4.2 需要课程登陆
require_course_login()
看资源文件,阅读词汇的条目的进入权限
function require_course_login($courseorid, $autologinguest = true, $cm = NULL, $setwantsurltome = true, $preventredirect = false)
3.4.3 是否为访客、登录、站点管理员
isguestuser(), isloggedin() and is_siteadmin()
不推荐使用 is_siteadmin() 在活动模块中,请用标准的权限判断函数has_capability()代替
3.4.4 是游览、查看、注册
is_guest(), is_viewing() and is_enrolled()
为了进入课程下面的函数中必须有一个返回真:
· is_enrolled() - 用户有注册记录
· is_viewing() - 用户有课程查看权限
· is_guest() - 用户被给予临时的访问权限
3.4.5 通过权限获取用户
get_users_by_capability()
这个方法返回被给指定权限的用户列表, 他忽略注册状态只需要给予课程上下文权限。