基于Django的角色的看法?(Django role based views?)

2019-07-21 20:01发布

我在寻找一些输入对别人怎么会这样的建筑师。 我将提供基于类(Django的群体)的意见。

例如,用户组将确定哪些意见/模板,他或她将有机会获得。 我想也许是存储路径在一个表中查看的功能,以确定哪些用户的链接栏将包括。 过滤器的规格也可以存储,以确定是什么行会填补这些模板。

一个很好的例子是医院护理部。 在一个监护室的护士不需要看到整个医院的病人。 他们只需要看到他们的病人。 同一单位的医生只需要看到那些患者为好,但他们应该有更大的功能的访问。

这已经通过了一些第三方的应用程序呢? 你将如何解决这个问题?

谢谢,皮特

Answer 1:

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):

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

{% 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), [])

可能有许多其他方法。



Answer 2:

有一个关于在Django基于角色的权限的新项目很有意思: http://bitbucket.org/nabucosound/django-rbac



Answer 3:

我们有一个类似的问题。 Django的群体是不是真的适合这个,但你可以在他们鞋拔子。

在路上,我们做了如下:

每一个访问控制对象具有多对多关系的组表。 每个组被用来定义一个特定类型的权限(“可以查看病人基”,“可以编辑患者接触信息”,等等)。 用户被添加到组,他们应该有(在你看到只有在这家医院的病人的例子,你可以有一个“谷 - 视图 - 医院”组)的权限。

然后,当你去显示的记录给用户的列表中,您筛选基础上,两组的结合。 用户必须具有所有相关联的组权限,以查看给定的对象。

如果你的系统需要它,你可以保持负权限,或者单独的读/写权限的单独的多对多。 你也可以定义一组导致您的查询检索过滤权限的实际子集的元组(医生,护士)的。

基于对象的用户可以查看或编辑的类别过滤器,然后用-至于你的链接条的问题的话,你可以通过编程使用同一个系统中生成的那些get_absolute_url()类型的函数(也许称之为get_index_url() )返回为每个类对象的索引的链接。

因为这一切都是相当复杂的,你可能最终想要做缓存为这些事情的一些水平,但搞不定你懒得优化之前。 这是可能的,这是不太丑陋的代码比在词。



Answer 4:

我不是很久以前也有类似的问题。 我们的解决方案并获得成功,尽管它可能是你的情况太简单了。 每个人都在表明,我们使用Django的许可制度来控制与哪些机型的用户交互。 但是,我们不只是试图组的用户,我们还通过GenericForeignKey分组的对象。

我们建立了一个链接到自己允许被开发层次结构模型。

class Group( models.Model ):
    name = models.CharField( ... )
    parent = models.ForeignKey( 'self', blank=True, null=True)
    content_type = models.ForeignKey( ContentType )
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey( 'content_type', 'object_id' )
    ...

为了使其工作,我们还创建了一个模型作为Django的用户模型的用户配置文件。 它所包含的是链接到这组模型之上的ManyToManyField。 这使我们能够根据需要给予用户访问零个或多个组。 ( 文档 )

class UserProfile( models.Model ):
    user = models.ForeignKey( User, unique=True )
    groups = models.ManyToManyField( Group )
    ...

这给了我们最好的两个世界,并保持我们从试图鞋拔子到一切Django的许可制度。 我使用这个基本的设置来控制用户的体育内容的访问(有些用户可以访问整个联赛,有的只有一两个会议,有的只能访问单个团队),以及它的工作原理以及在这种情况下。 这也许可能是一个广义的,足以满足您的需求。



Answer 5:

如果你并不需要真正的基于对象的ACL,那么你可以使用Django的许可制度。 要获得所有可用权限的列表:

from django.contrib.auth.models import Permission
perms = Permission.objects.all()

有一个其他身份验证和授权来源API ,所以你不需要坚持使用这个权限表。

您可以破解这个Django的系统,以适应这一授权模型(RBAC)的条款您的需求,或者您可以拿出一个ACL样的解决方案。



Answer 6:

在对黑比诺葡萄酒专家网站,我们创建了基于许多不同的标准每个对象的访问。 如果入站链接有这样相匹配的特色酒庄的域名引荐字段,那么用户有一个“酒厂令牌”,这扩大到所有文章,品酒笔记等与该酒厂。 我们使用给予赠品“命名的令牌”在品酒活动,他们给访问该网站的特定部分。 我们甚至用它来给予一定的权限类型的搜索引擎的蜘蛛,然后请确保来自那些搜索引擎的链接有相同的权限蜘蛛那样(即无伪装游戏)。

简短的版本是,你可以创建一个类(我们称他们为持有令牌TokenBuckets)和每个对象(详细信息页面,或创建一个列表页面,或任何上)可以要求用户的TokenBucket是否允许访问一定水平。

基本上这是一个奇怪的一种ACL系统。 这并不是说努力创造机制。 所有的神奇的是在其下令牌进入桶中什么情况下决定。



Answer 7:

您可以使用Django用户角色

https://github.com/dabapps/django-user-roles



Answer 8:

这个问题已经被问在2009年10月 ,但问题仍然在2012年7月存在。

我已经寻找一个良好的基于角色的应用程序,并发现django-permission为最好的结果。

我需要三个重要的特点是角色 ,查看装饰Templatetag; 显然django-permissions也个个。 阅读它的文档为它的用法。

唯一的缺点是,它正在开发中。



Answer 9:

我们使用一个角色的基础系统,类似的问题。 基本上,用户有权承担不同的角色。

查看功能得到了装饰:

def needs_capability(capability,redirect_to="/cms/"):
   def view_func_wrapper(view_func):
       def wrapped_view_func(request,*args,**kwargs):
           if not request.role._can(capability):
              return HttpResponseRedirect(redirect_to)
           return view_func(request,*args,**kwargs)
       return wrapped_view_func
   return view_func_wrapper

神奇的其余部分是内部request.role它得到的上下文对应处理器内部属性。 身份验证的用户得到了一个角色,对于未洗的群众DummyRole。

获取信息是在模板中限制进一步:

 {% if not request.role.can.view_all_products %}
          Lots of products, yeah!
 {% endif %}

不要在我看来,最干净的解决方案,但都按预期。



文章来源: Django role based views?