24

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

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

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

4

5 回答 5

26

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

如果我们谈论的是您自定义创建的视图,那么您可以创建一些东西来检查用户的权限,如果他们没有该权限,则返回 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):
    # ...

使用权限,您可以轻松地使用管理界面从用户和组中添加或删除它们。

于 2011-01-04T19:15:17.480 回答
10

您需要手动管理它,但这很容易。大概有一个属性可以确定组是否有权查看视图:然后您只需使用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是 User 对象上的某种方法。

身份验证文档非常全面。

于 2011-01-04T19:23:59.400 回答
4

对于基于类的视图,您可以将类继承 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')

查看此文档以获取有关如何使用此功能的更多详细信息:

于 2016-11-21T17:19:10.813 回答
2

如果您使用的是 Django 1.9+,您应该能够使用PermissionRequiredMixin

例如:

from django.contrib.auth.mixins import PermissionRequiredMixin

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

这基本上是 的一种特殊情况UserPassesTestMixin,专门用于测试用户是否具有指定的权限。

于 2019-07-25T21:01:10.743 回答
1

权限系统以模型为中心,并假设权限与模型相关联。我认为以下两种选择是最好的选择:

A. 如果您的视图与某个特定模型相关,请按照 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以将自定义权限添加到数据库。

于 2011-01-05T01:10:13.267 回答