Drupal China
任何一个开放系统(Open System), 只要它与外界有接口, 就存在安全问题, 越是商业级应用越注重安全. 安全管理涉及很广, 大到整个网络安全的设定,小到具体按钮的访问, 如果你的系统哪天出现安全问题, 没准追根溯源能找到机房看门老头, 呵呵, 玩笑话略过, 今天我们主要看看Drupal的用户权限管理, 也就是访问控制系统.
权限管理的要素
我认为, 一个权限管理系统主要由以下四要素组成: 访问者, 管理对象, 操作和规则.
权限管理的系统功能
可以说, 自从有了安全问题, 大家就在围绕这几个要素伤脑筋, 针对各种不同的管理需求, 也出现了各种不同的权限管理的方案, 如何在安全性, 操控性, 性能以及开发复杂性间取得平衡是恒古不变的主题. 为了聚焦今天的话题, 我们主要从系统功能角度来窥视一下, 看看一个权限系统到底是如何工作的.
是不是比较清楚, 把这几个系统功能考虑完全, 并实现好, 你的系统就安全了一半; 另一半是什么, 是你的安全意识, 天干物燥, 防火防盗, 只有真正树立安全意识, 才能有效地去应用各种安全措施, 防范危险. 不幸的是, 我们大多数人都疏予管理, 闲置, 不管不顾.
Drupal的权限管理框架
首先我们来识别系统中具备哪些要素: Drupal是一个基于web的CMS系统, 所以访问者主要局限在管理员和普通web访问用户(User); 而管理对象则是CMS中的核心--内容, 在drupal中它被抽象为节点(Node). (应该还会有些其他的管理对象). 操作呢? 菜单, 按钮, 在web系统里是不是都对应到页面, 也就是内部路径(例如: "node/1/view"), 规则没什么特殊的: 操作时出现禁止页面, 列表中不出现无权限内容等.
Drupa采用角色来关联用户和操作, 每个角色是从方便系统管理角度出发来定义的一类具备相同操作界面或行为的访问者, 但它不是简单的用户或操作的分组, 而是他们的有机结合, 形象的说就是一组权力的代名词或者叫Permission Scheme. Drupall针对操作是否涉及到管理对象, 设计了两个不同的鉴权流程, 以满足不同的权限管理要求.
(1)与内容无关的操作权限
权限定义
钩子hook_perm, 定义了每个模块的操作权限, 用操作名描述.
<?php
/**
* Implementation of hook_perm().
*/
function book_perm() {
return array('add content to books', 'administer book outlines', 'create new books', 'access printer-friendly version');
}
?><?php
function forum_menu() {
$items['forum'] = array(
'title' => 'Forums',
'page callback' => 'forum_page',
'access callback' => '_example_test_access', //这里指定访问验证回调函数, 默认为hook_access()钩子,
'access arguments' => array('access content'),
'type' => MENU_SUGGESTED_ITEM,
'file' => 'forum.pages.inc',
);
?><?php
/**
* Implementation of hook_access().
*/
function forum_access($op, $node, $account) {
switch ($op) {
case 'create':
return user_access('create forum topics', $account);
case 'update':
return user_access('edit any forum topic', $account) || (user_access('edit own forum topics', $account) && ($account->uid == $node->uid));
case 'delete':
return user_access('delete any forum topic', $account) || (user_access('delete own forum topics', $account) && ($account->uid == $node->uid));
}
}
?>Drupal的权限管理方法
1, 基本权限管理
尽管Drupal的权限管理机制是强大复杂的, 但其默认的基本权限管理却非常简单, 基于角色(role)和操作权限, 把操作赋予角色, 而把角色赋予用户, 这样用户就能使用相应的权限. 基本权限管理粒度较粗, 只能满足一般的安全需求.
2, 按内容类型鉴权
如果我们对管理对象有更精细的管理要求, 比如我想让A角色能访问page, B角色只能访问story, 咋办? 基本权限管理做不到了, 那我们就扩展模块. 内容访问模块(Content Access )允许你对内容类型按角色设置权限(查看, 编辑, 删除). 其实Drupal6.2基本权限管理里也能设置按内容类型进行鉴权, 因为drupal把所有节点类型的几个基本操作都注册了, 看下面这个丑陋的循环, 呵呵, 这几个也是汉化不到位的地方.
<?php
function node_perm() {
$perms = array('administer content types', 'administer nodes', 'access content', 'view revisions', 'revert revisions', 'delete revisions');
foreach (node_get_types() as $type) {
if ($type->module == 'node') {
$name = check_plain($type->type);
$perms[] = 'create '. $name .' content';
$perms[] = 'delete own '. $name .' content';
$perms[] = 'delete any '. $name .' content';
$perms[] = 'edit own '. $name .' content';
$perms[] = 'edit any '. $name .' content';
}
}
return $perms;
}
?>3, 按组鉴权
如果是个大公司, 有很多部门, 相互间都有安全需求, 比如:
1. 能按不同的部门创建不同的组, 它们都能管理其私有内容
2. 组成员拥有组内的权限
3. 跨组间允许指定某些特定的权限共享
4. 匿名用户只能访问标识为"public"的内容, 注册用户能访问public和Restricted, 仅组成员能访问private等
看到这么多需求, 则我们需要一个更复杂的权限管理, drupal目前有两个扩展模块都能提供类似的功能:
(a) taxonomy_access modules
使用drupal的分类模块的基本功能, 完成以上的权限控制, 这里有英文的教程, 步骤描述较清楚.
i, 定义一个词汇表(Groups), 用来定义组(即公司部门); 把它应用到所有内容类型, 再添加2个条目(比如财务, 研发)
ii, 再定义一个词汇表(Access), 用来定义访问级别; 同样应用到所有内容类型, 同时还要设置"必须"的选项, 这样保证创建内容时必须选一个该
词汇表中的条目. 加三个条目(public, Restricted, Private)
iii, 按基本权限管理的方法创建2个角色(财务人员, 开发人员), 再创建几个用户, 并分辨赋予对应角色(张三->财务, 李四->开发)
iv, 前面都是基本管理,没涉及到扩展模块, 现在打开"administer > user management > taxonomy access: permissions", 按照步骤开始设吧, 一个组鉴权系统完成, 祝你好运.
(b) 著名的OG
Organic Groups功能太强了, 上面的需求全部能满足, 组或圈的概念是大型社区不可缺少的, 别犹豫了, 能用就用吧.
总之, drupal的权限管理机制非常灵活, 可简可繁, 每个系统都安全的需求都是不一样的, 你们的权限管理有哪些特殊的好实现, 拿出来show绣把.
终于知道OG是什么了...
终于知道OG是什么了...谢谢xeopn的文章,对DP的架构又了解了不少...
这个网站究竟是搞什
这个网站究竟是搞什么的,我是被逼注册的!
實在是十分非常實用
實在是十分非常實用有用好看的文章,不過某些字型看上去怪怪的吧。
---------------------------------------------
網絡賺錢訊息、Blog、討論區and Drupal
http://www.MakeMoneyOK.com
---------------------------------------------
關注瀏覽器資訊,Blog、討論區.......
http://www.PlzOn.com
错字!
ceopn你好,
这里想提醒一下你的文章有错字:
就在开始的第二行字: 把 Drupal 给打错了:
“今天我们主要看看Druap的用户权限管理,”
这种水平的文章可以
这种水平的文章可以集结出版了,强烈支持
--
爱好飞行模拟游戏,Drupal 建网站 http://fsgame.org ,欢迎交流。
--
微软飞行模拟爱好者社区 Drupal 驱动
呵呵,原来做过OG的扩
呵呵,原来做过OG的扩展,drupal的权限不是一般的强大啊,不过如果组权限分的太细的话,对数据库负担也挺大的
------------------------------
www.ykfan.cn
------------------------------
www.ykfan.cn
www.wifiok.cn
非常不错,支持~
大家就该多写文章分享~~
==============a scratch of pen of jason==================
www.5iphp.com
www.5iphp.com 关于drupal学习、drupal经验、drupal教程的网站