Moodle插件开发笔记5:基础知识五

访问控制,登录和角色 Access control, logins, and roles    Moodle的登录函数使用PHP的’cookie&#…

访问控制,登录和角色
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
         并陆续发布开发笔记,敬请留意。转贴请注明出处。

作者: admin

为您推荐

联系我们

联系我们

邮箱:

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部