我正在寻找一些关于其他人如何架构这一点的意见。我将提供基于类(django组)的视图。
例如,用户组将决定他或她将有权访问的视图/模板。我正在考虑将视图函数的路径存储在一个表中,以确定用户的链接栏将由什么组成。还可以存储筛选器规范,以确定哪些行将填充这些模板。
医院护理单位就是一个很好的例子。一个单位的护士不需要看整个医院的病人。他们只需要去看他们的病人。同一单位的医生也只需要看这些患者,但他们应该可以访问更大的功能。
这是通过一些第三方应用程序完成的吗?你将如何处理这个问题?
谢谢,皮特
发布于 2009-10-10 01:00:28
Django已经有一个组和权限系统,这可能足以满足您的目的。
http://docs.djangoproject.com/en/dev/topics/auth/
通常,在您的代码中,您可以检查用户是否具有权限。用户拥有自己的权限和所属组的权限。您可以很容易地从管理控制台进行管理。
您需要注意两个部分。
对于1。您可以在装饰器中检查权限,如下所示:
from django.contrib.auth.decorators import permission_required
@permission_required('polls.can_vote')
def some_view(request):
对于2.当前登录用户的权限存储在模板变量{{ perms }}中。此代码检查与上面相同的权限。
{% if perms.polls.can_vote %}
<a href="/vote">vote</a>
{% endif %}
要生成链接列表,可以遍历user.get_all_permissions()并从字典中获取链接(或生成链接的函数):
def more_elaborate_list_of_links_for_a_perm(user):
return ["/link1", ...]
_LINKS = {
'polls.can_vote' : lambda u: ["/user/specific/link/" + u.id],
'polls.can_close': lambda u: ['/static/link/1', 'static/link/2'],
'polls.can_open' : more_elaborate_list_of_links_for_a_perm
}
def gen_links(user):
# get_all_permissions also gets permissions for users groups
perms = user.get_all_permissions()
return sum((_LINKS[p](user) for p in perms if p in _LINKS), [])
可能还有很多其他的方法。
发布于 2009-10-29 14:01:03
我们也遇到过类似的问题。Django的团队并不适合这样做,但你可以硬塞给他们。
我们这样做的方法如下:
每个访问控制对象都与groups表有一个ManyToMany关系。每个组用于定义特定类型的权限(“可以查看患者基本信息”、“可以编辑患者联系信息”等)。用户被添加到他们应该拥有权限的组中(在您的示例中,仅在此医院中查看患者,您可以有一个“valley view- have”组)。
然后,当您要向用户显示记录列表时,您可以根据这两个组的连接进行筛选。用户必须拥有所有关联的组权限才能查看给定对象。
如果您的系统需要,您可以保留一个单独的负权限ManyToMany,或单独的读/写权限。您还可以定义一组元组(医生、护士),以使查找筛选器检索实际的权限子集。
就您的链接栏问题而言,您可以基于用户可以查看或编辑的对象类,使用相同的系统过滤器以编程方式生成这些链接,然后使用get_absolute_url()
类型函数(也可以称为get_index_url()
)返回每个对象类的索引的链接。
因为所有这些都相当复杂,所以您最终可能希望为这些内容做一些级别的缓存,但在进行优化之前先让它正常工作。这是可能的,而且它在代码中的丑陋程度比在语言中要低。
发布于 2009-11-03 00:39:19
在Django中有一个非常有趣的关于基于角色的权限的新项目:http://bitbucket.org/nabucosound/django-rbac
https://stackoverflow.com/questions/1546670
复制相似问题