首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络技术 > 网络基础 >

从sakai的用户注册效能窥其权限设计

2012-10-31 
从sakai的用户注册功能窥其权限设计你会觉得sakai的新用户注册功能是很简单的。的确,如果你在官方demo的基

从sakai的用户注册功能窥其权限设计
你会觉得sakai的新用户注册功能是很简单的。的确,如果你在官方demo的基础上只需要配置一个tool就好了,但如果没有一些原始数据呢,即如果将demo中默认的realm删除掉,你还能轻松配置这个功能吗?这背后就涉及到sakai的realm策略及其实现。
我理想的权限设计包括这些部分:资源、情景、角色、用户、操作。某个用户在特定情景下,扮演某个角色,去操作某个资源。用编程实现就是:用url表示情景,根据数据库中的记录,可以计算出用户此时的角色,角色则是一个集合,包含了某个资源是否可以被操作的直接信息。
Sakai的权限思路是:资源+操作+用户。
上pp,下面是添加用户时的堆栈情况。

其中unlock是权限检查,决定addUser是否能执行。Unlock在SakaiSecurity.java中。

如上所示,如果是超级用户登录,这个操作被允许;再看有没有暴露给外部的仲裁接口即Advisor;最后再检查授权组的权限,即checkAuthzGroups()函数,在这里,其第四个参数azgs其实就是realm列表,这里是null。

看看第309行,getAuthzGroups,是怎么获得realm的。
跟下去,会跟到BaseUserDirectoryService.java中getEntityAuthzGroups

在1697行和1699行,添加了两个realm,一个是以资源本身的id为realm;另一个根据userId的userType绑定资源的realm,如下代码。

所以,realm就找好了。下面是
isAllowed(String userId, String lock, Collection<String> realms) 在DbAuthzGroupService.java中。然后就在数据库中寻找相应realm对应的权限,下面是sql语句:
select count(1) from sakai_realm_rl_fn,sakai_realm force index (ak_sakai_realm_id) where sakai_realm_rl_fn.realm_key = sakai_realm.realm_key and  sakai_realm.realm_id in (x'2f757365722f31646466626235392d633734342d346462652d383533332d383334343634636661363433',x'21757365722e74656d706c617465') and function_key in (select function_key from sakai_realm_function where function_name = x'757365722e616464')  and (role_key in (select role_key from sakai_realm_rl_gr where active = '1' and user_id = null  and realm_key in (select realm_key from sakai_realm where  sakai_realm.realm_id in (x'2f757365722f31646466626235392d633734342d346462652d383533332d383334343634636661363433',x'21757365722e74656d706c617465')))  or role_key in (select role_key from sakai_realm_role where role_name = '.anon') )
总结:
1、要使用注册用户功能,必须构造名称为!user.template的realm,并赋予.anon角色user.add的权限。
2、对资源的控制,都在!user.template中(用户信息也是一种资源)。

热点排行