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

你会觉得sakai的新用户注册功能是很简单的。的确,如果你在官方demo的基础上只需要配置一个tool就好了,但如果没有一些原始数据呢,即如果将demo中默认的realm删除掉,你还能轻松配置这个功能吗?这背后就涉及到sakai的realm策略及其实现。
我理想的权限设计包括这些部分:资源、情景、角色、用户、操作。某个用户在特定情景下,扮演某个角色,去操作某个资源。用编程实现就是:用url表示情景,根据数据库中的记录,可以计算出用户此时的角色,角色则是一个集合,包含了某个资源是否可以被操作的直接信息。
Sakai的权限思路是:资源+操作+用户。
上pp,下面是添加用户时的堆栈情况。
[img]http://dl.iteye.com/upload/attachment/229716/579999cd-4fff-3bcd-a17a-b35f0145d2ac.png[/img]
其中unlock是权限检查,决定addUser是否能执行。Unlock在SakaiSecurity.java中。
[img]http://dl.iteye.com/upload/attachment/229722/d7196b8e-3cc5-3f10-bdb8-eeb86c1d9a43.png[/img]
如上所示,如果是超级用户登录,这个操作被允许;再看有没有暴露给外部的仲裁接口即Advisor;最后再检查授权组的权限,即checkAuthzGroups()函数,在这里,其第四个参数azgs其实就是realm列表,这里是null。
[img]http://dl.iteye.com/upload/attachment/229730/e5445582-6121-309d-8066-3423d02bb63f.png[/img]
看看第309行,getAuthzGroups,是怎么获得realm的。
跟下去,会跟到BaseUserDirectoryService.java中getEntityAuthzGroups
[img]http://dl.iteye.com/upload/attachment/229726/40979e3f-4c8a-3bcc-aeb5-fd26ee70242a.png[/img]
在1697行和1699行,添加了两个realm,一个是以资源本身的id为realm;另一个根据userId的userType绑定资源的realm,如下代码。
[img]http://dl.iteye.com/upload/attachment/229728/b12bc056-2017-31ea-9d86-d21116a1f944.png[/img]
所以,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中(用户信息也是一种资源)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值