如何使用Django和Python按照经过身份验证的用户检查权限

时间:2017-08-14 07:10:38

标签: python django

我需要根据验证用户使用Django和Python检查所需的权限。我在下面解释我的代码。

class Permission(models.Model):
    """docstring for Permission"""

    user_id = models.ForeignKey(User)
    class Meta:
        permissions = (
            ("view_reactor", "1"),
            ("find_reactor", "1"),
            ("controll_reactor", "0"),
        )

Views.py:

from django.contrib.auth.decorators import permission_required


def view_reactor(request):
    """ This function for to get serch screen. """

    return render(request, 'plant/view_reactor.html',
                        {'count': 1})

在这里,我需要根据正确的@permission_required检查userid装饰器功能。假设登录用户具有权限("view_reactor", "1"),,那么view_reactor函数可以访问("view_reactor", "0"),然后无法访问。

2 个答案:

答案 0 :(得分:1)

您为模型添加了额外的权限,其中第一个值是权限名称,第二个是人类可读的名称(详情请meta permissions),所以如果我理解您需要将其添加到Reactor例如:

class Reactor(models.Model):
    # ^^^^^^
    # ....
    user_id = models.ForeignKey(User)

    class Meta:
        permissions = (
            ("view_reactor", "can view reactor"),
            ("find_reactor", "can find reactor"),
            ("controll_reactor", "can controll reactor"),
        )

您可以在视图中使用

from django.contrib.auth.decorators import permission_required

@permission_required('reactor.view_reactor')
def view_reactor(request):

抱歉,如果我误解了

答案 1 :(得分:0)

为什么不使用Django默认使用的User,Permission,Group Class?

models.py in exampleApp
class ExampleModel(models.Model):
    somefield = models.CharField(max_length=4)

如果您执行'makemigration'和'migrate',它会自动创建'add_examplemodel','change_examplemodel','delete_examplemodel'。您可以在DB中检查auto_permission表。

models.py in exampleApp
class ExampleModel2(models.Model):
    somefield = models.CharField(max_length=4)
    class Meta:
        permissions = ( (permission_code, human_readable_permission_name), )

如果您使用该模型执行'makemigrations'和'migrate',它不会创建三个默认权限,只会创建一个您在Meta类中命名的权限。 (它在您创建模型时起作用,而不是在您编辑时起作用)

您只需在管理页面中添加权限。

它只是在Permission类中添加权限名称。您需要为User设置权限。

您可以像这样在用户中授予权限。

user = User.objects.get(id=someidnumber)
# User and Permissions Class have manytomany relationship.
user.permissions_set.add(permission, ... )
# you can set user 1 have one permission like view_reactor.
# you can set user 2 have two permission like view_reactor, find_reactor.
# you can give permissions to each user independently.

然后,您可以使用@permission_required decorator

如果您希望用户1拥有view_reactor权限。只需通过User.objects.get(id=user1_id).permissions_set.add(view_reactor permission)授予用户1权限。然后@permission_required decorator将会检查。

请阅读以下手册。

Adding Permission in Manual

permission_required decorator in manual