从管理员我看到,您可以将权限分配给用户或用户组:允许添加,更改或从模型中删除数据。

这很棒,但是我还需要允许用户或用户组访问或不访问一组视图。我在网站上有某些类型的服务,因此我想允许某些用户访问某些服务(页面/视图),而不是其他服务。

那么,如何允许某些用户/用户组访问某些视图?谢谢!

有帮助吗?

解决方案

无法添加或更改等的用户,某个模型将无法在管理员中看到它。

如果我们谈论您的自定义创建视图,那么您可以创建一些检查用户许可的用户,并在没有该许可的情况下返回404。权限链接到模型,可以为组分配各种权限。

您可以为这样的模型添加权限:

# myproject/myapp/models.py

class MyModel(models.Model):
    class Meta:
        permissions = (
            ('permission_code', 'Friendly permission description'),
        )

然后,您可以检查一个用户是否有这样的权限:

@user_passes_test(lambda u: u.has_perm('myapp.permission_code'))
def some_view(request):
    # ...

使用权限,您可以轻松地使用Admin界面从用户和组中添加或将其删除。

其他提示

您需要手动管理该操作,但这很容易。据推测,有一个属性可以确定一个组是否有权查看视图:然后,您只需用任何一个即可装饰该视图 permission_required 装饰师,如果这是一个简单的问题,即用户是否有特定许可,或者 user_passes_test 如果有点复杂:

@user_passes_test(lambda u: u.is_allowed_to_see_view_myview())
def myview(request):
    ...etc...

假如说 is_allowed_to_see_view_myview 是用户对象上的某种方法。

身份验证文档 非常全面。

对于基于班级的视图,您可以继承 UserPassesTestMixin 将视图类别定义 test_func

from django.contrib.auth.mixins import UserPassesTestMixin

class MainView(UserPassesTestMixin, View):

    def test_func(self):
        return self.request.user.has_perm('app.get_main_view')

看一眼 这个文档 有关如何使用此信息的更多详细信息:

权限系统以模型为中心,并假定权限与模型相关。我认为以下2个替代方案是最佳选择:

答:如果您的观点与某些特定模型有关,请按照Marcus Whybrow的建议使用该模型上的自定义权限。

B. [未测试,可能不起作用]子类 User 并在那里定义自己的权限。您不需要实际模型,它只是应用程序自定义许可的包装器:

from django.contrib.auth.models import User
class MyUser(User):
    class Meta:
        permissions = (('can_visit_$viewset1', 'Can visit $view_set_1'))

不要忘记跑步 syncdb 将自定义权限添加到数据库中。

如果您使用的是Django 1.9+,则应该能够使用 PermissionRequiredMixin: https://docs.djangoproject.com/en/1.9/topics/auth/default/#django.contrib.auth.mixins.mixins.permissionrequiredmixin

例如:

from django.contrib.auth.mixins import PermissionRequiredMixin

class MainView(PermissionRequiredMixin, View):
    permission_required = 'my_services.foo_bar'
    ...

这基本上是一个特殊情况 UserPassesTestMixin, ,专门用于测试用户是否已获得指示许可。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top