我在寻找一些输入对别人怎么会这样的建筑师。 我将提供基于类(Django的群体)的意见。
例如,用户组将确定哪些意见/模板,他或她将有机会获得。 我想也许是存储路径在一个表中查看的功能,以确定哪些用户的链接栏将包括。 过滤器的规格也可以存储,以确定是什么行会填补这些模板。
一个很好的例子是医院护理部。 在一个监护室的护士不需要看到整个医院的病人。 他们只需要看到他们的病人。 同一单位的医生只需要看到那些患者为好,但他们应该有更大的功能的访问。
这已经通过了一些第三方的应用程序呢? 你将如何解决这个问题?
谢谢,皮特
Answer 1:
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.当前登录用户的权限存储在模板变量{{烫发}}。 此代码检查与上述相同的许可。
{% 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?