Django基于角色的观点?

sly*_*ete 31 architecture django acl

我正在寻找其他人如何构建这个的一些意见.我将提供基于类(django组)的视图.

例如,用户的组将确定他或她将访问哪些视图/模板.我在考虑存储路径以查看表中的函数以确定用户的链接栏将包含哪些内容.还可以存储过滤器规范以确定将填充这些模板的行.

一个很好的例子是医院护理单位.一个单位的护士无需看到整个医院的病人.他们只需要看病人.同一单位的医生也只需要看到这些患者,但他们应该可以获得更多的功能.

这是通过一些第三方应用程序完成的吗?那你怎么解决这个问题呢?

谢谢,皮特

mba*_*hau 43

Django已经有了一个组和权限系统,这可能足以满足您的需要.

http://docs.djangoproject.com/en/dev/topics/auth/

通常在您的代码中检查用户是否具有权限.用户拥有自己的权限以及他所属的组的权限.您可以从管理控制台轻松管理它.

您需要看两个部分.

  1. 检查请求页面的用户是否有权这样做.
  2. 只有拥有该权限的用户才能显示该用户的链接.

对于1.您可以检查装饰器中的权限:

from django.contrib.auth.decorators import permission_required

@permission_required('polls.can_vote')
def some_view(request):
Run Code Online (Sandbox Code Playgroud)

对于2.当前登录用户的权限存储在模板变量{{perms}}中.此代码检查与上述相同的权限.

{% if perms.polls.can_vote %}
    <a href="/vote">vote</a>
{% endif %}
Run Code Online (Sandbox Code Playgroud)

要生成链接列表,您可以迭代user.get_all_permissions()并从dict获取链接(或生成链接的函数):

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), [])
Run Code Online (Sandbox Code Playgroud)

可能还有很多其他方法.


Pau*_*lan 5

我们遇到了类似的问题。Django 的小组不太适合这个,但你可以硬塞进去。

我们的做法如下:

每个访问控制的对象都与组表有一个多对多的关系。每个组用于定义特定类型的权限(“可以查看患者基本信息”、“可以编辑患者联系信息”等)。用户被添加到他们应该拥有权限的组中(在您仅查看这家医院的患者的示例中,您可以拥有一个“valley-view-hospital”组)。

然后,当您向用户显示记录列表时,您可以根据两个组的连接进行过滤。用户必须拥有所有关联的组权限才能查看给定的对象。

如果您的系统需要它,您可以保留单独的多对多负面权限,或单独的读/写权限。您还可以定义一组元组(医生、护士),这些元组会导致您的查找过滤器检索实际的权限子集。

就您的链接栏问题而言,您可以使用相同的系统过滤器以编程方式生成那些基于用户可以查看或编辑的对象类,然后使用get_absolute_url()类型函数(可能调用它get_index_url())返回链接每类对象的索引。

因为所有这些都相当复杂,所以您可能最终想要为这些事情做某种程度的缓存,但在您费心优化之前让它工作。这是可能的,而且它在代码中没有文字那么难看。


juj*_*ule 5

关于Django中基于角色的权限有一个新的非常有趣的项目:http: //bitbucket.org/nabucosound/django-rbac