访问控制,登录和角色
Access control, logins, and roles
Moodle的登录函数使用PHP的’cookie’的功能设置成当前会话的Cookie。
1、六种分配级别权限:
·site/global(网站全局)
·course category(课程类)
·course(课程)
·blocks(块)
·activities(活动)
·user(用户)
·front page(首页)
Contexts是与定义的context水平相关的系统中的元素
Context定义在/lib/accesslib.php里
define(‘CONTEXT_SYSTEM’, 10);
define(‘CONTEXT_USER’, 30);
define(‘CONTEXT_COURSECAT’, 40);
define(‘CONTEXT_COURSE’, 50);
define(‘CONTEXT_GROUP’, 60);
define(‘CONTEXT_MODULE’, 70);
define(‘CONTEXT_BLOCK’, 80);
“System”context只有一个,其他的则有许多个,如”Course”context,“User”context等。
2、有7个内置的角色(role)
·administrator(管理员):系统管理员拥有任何权限,操作任何课程。
·teacher(教师):教师可以在负责的课程中做任何事,包括更改活动和为学生评分。
·non-editing teacher(无编辑权教师):可以在课程中教授和给学生们打分,但是无法改变活动内容。
·student(学生):可参加一门课程,通常拥有较少的特权。
·course creator(课程创建者):可以创建课程,并可以限制在一个课程类别里。
·authenticated user(认证的用户):任何登录的用户都有这个角色
·guest(访客):非登录用户拥有最小的权限,而且通常不能在任何地方输入文本。
这些role都可以分配给上面的一个或多个context。
每个用户可以拥有多个角色,这些角色继承所有适用于从用户访问请求的context级别的权限。
Capabilities are associated with context levels, and are specific access rules that can be granted to roles.
Examples of capabilities are:
·moodle/site:manageblocks: Can manage blocks at the site context level
·moodle/user:viewdetails: Can view details of a user at the user context level
·moodle/course:view: Can view a course at the course context level
每一个capability都可以assign给下列4个访问权限级别(access levels)的其中一个:
·Not Set(没有设置)
·Allow(允许)
·Prohibit(禁止)
·Prevent(避免)
注意:开发者可以通过创建capabilities来控制访问我们的新功能。
总结来说:
·Contexts are specific elements in Moodle(Contexts是Moodle中的特定元素)
·Roles are associated with all contexts(Roles是与所有的contexts关联的)
·Capabilities are assigned to roles in a given context(Capabilities都被分配给特定context下的角色)
·Users are assigned to roles in a given context(用户都被分配给特定context下的角色)
普通系统使用User, Role, Capability就OK了,为什么moodle还要加多一个context?
这是因为同一个user在不同的context的role不同,比如在system context,user是admin role,而他在course“foo”里是instructor role(导师角色)
3、每个user role在不同的context里的capability都不同。
获取context对象的函数是get_context_instance()。
例:获取system context对象
$context = get_context_instance(CONTEXT_SYSTEM);
获取当前course的context
global $COURSE;
$context = get_context_instance(CONTEXT_COURSE, $COURSE->id);
获取context之后,下列2个函数是用来check当前login的user在该context里是否有所指定的capability。
·require_capability测试当前用户的capabilities,看看他们是否在指定context内有指定的capability,如果他们没有,页面就重定向到一个错误页面。
·has_capability功能与require_capability类似,但不会重定向到错误页面,而是return true or false
例:
$context = get_context_instance(CONTEXT_SYSTEM);
require_capability(‘moodle/site:doanything’, $context);
上面的例子是检查当前用户在system context里是否有’moodle/site:doanything’的capability。
如何为你的moodle plugin/module自定义capability?
在plugin/module的root目录下创建一个db目录,然后在db目录下创建一个access.php,该文件用来定义capability。
下例是在helloworld block里定义一个block/helloworld:view capability,该capability的type是read,该capability是属于system context level里,并设置只有admin role user拥有该capability,其他role没有。
代码如下:
<?php
$block_helloworld_capabilities = array(
‘block/helloworld:view’ => array(
‘captype’ => ‘read’,
‘contextlevel’ => CONTEXT_SYSTEM,
‘legacy’ => array(
‘guest’ => CAP_PREVENT,
‘student’ => CAP_PREVENT,
‘teacher’ => CAP_PREVENT,
‘editingteacher’ => CAP_PREVENT,
‘coursecreator’ => CAP_PREVENT,
‘admin’ => CAP_ALLOW
)
)
);
?>
注意:该capability适用于任何使用了该block的地方。无论你是把该block加到home page,还是admin page,还是My Moodle page,还是course page,该capability都适用。但由于该capability是定义在system context level,只有那些在system context level具有admin role的user才能够看到这个block。
接下来将学习5种类型的Moodle plugin的开发:
·block
·filter
·activity module
·theme
·course format
并陆续发布开发笔记,敬请留意。转贴请注明出处。
|