• [django]drf知识点梳理-权限


    用户  -  权限  -  资源
        (拥有)   (绑定)
    

    django权限机制能够约束用户行为,控制页面的显示内容,也能使API更加安全和灵活;用好权限机制,能让系统更加强大和健壮

    django权限控制

    Django用user, group和permission完成了权限机制,这个权限机制是将属于model的某个permission赋予user或group,可以理解为全局的权限,即如果用户A对数据模型(model)B有可写权限,那么A能修改model B的所有实例(objects)。group的权限也是如此,如果为group C 赋予model B的可写权限,则隶属于group C 的所有用户,都可以修改model B的所有实例。

    Django的权限项

    Django用permission对象存储权限项,每个model默认都有三个permission,即add model, change model和delete model
    permission总是与model对应的,如果一个object不是model的实例,我们无法为它创建/分配权限

    默认权限

    在 INSTALLED_APPS 设置中列出 django.contrib.auth 后,安装的各个应用中的每个 Django 模型默认都有三个权限:添加、修改和删除。每次运行 manage.py migrate 命令创建新模型时都会为其赋予这三个权限。

    权限应用

    Permission
    User Permission
    Group Permission
    权限检查

    Permission定义

    Django定义每个model后,默认都会添加该model的add, change和delete三个permission,自定义的permission可以在我们定义model时手动添加

    class Server(models.Model):
        ...    
        class Meta:
            permissions = (
                ("view_server", "can view server"),
                ("change_server_status", "Can change the status of server"),
            )
    

    每个permission都是django.contrib.auth.Permission类型的实例,该类型包含三个字段name, codename 和 content_type,

    content_type 反应了permission属于哪个model,
    codename     如上面的view_server,代码逻辑中检查权限时要用
    name         是permission的描述,将permission打印到屏幕或页面时默认显示的就是name
    

    User Permission

    User对象的user_permission字段管理用户的权限

    dashboard.view_server
    permission = app_label.codename

    user = User.objects.get(username="maotai")
    user.user_permissions = [permission_list]
    user.user_permissions.add(permission, permission, …) #增加权限 
    user.user_permissions.remove(permission, permission, …) #删除权限 
    user.user_permissions.clear() #清空权限
    user.get_all_permissions() #列出用户的所有权限
    user.get_group_permissions() # 列出用户所属group的权限
    

    Group Permission

    group permission管理逻辑与user permission管理一致,group中使用permissions字段做权限管理:

    group.permissions.set([permission_list])
    group.permissions.add(permission, permission, …) 
    group.permissions.remove(permission, permission, …) 
    group.permissions.clear()
    

    权限验证-普通视图

    在视图中验证权限—— permission_required
    当业务逻辑中涉及到权限检查时,decorator能够分离权限验证和核心的业务逻辑,使代码更简洁,逻辑更清晰。permission的decorator为permission_required

    from django.contrib.auth.decorators import login_required, permission_required 
    @login_required
    @permission_required(’dashboard.view_server')
    def my_view(request):
        ...
    

    权限验证-类视图

    from django.utils.decorators import method_decorator
    from django.contrib.auth.decorators import login_required, permission_required
    class ServerView(TemplateView):
        @method_decorator(login_required)
        @method_decorator(permission_required(“dashboard.view_server”)
        def get(self, request, *args, **kwargs):
            ...
    

    权限验证-view代码中验证

    检查用户是否有这个权限

    if not request.user.has_perm(’dashboard.view_server')
        return HttpResponse('Forbidden')
    

    权限验证-模板中验证

    验证是否有登陆

    {% if user.is_authenticated %}
        <p>Welcome, {{ user.username }}. Thanks for logging in.</p>
    {% else %}
        <p>Welcome, new user. Please log in.</p>
    {% endif %}
    

    验证是否有权限

    {% if perms.dashboard.view_server %}    
        有权限
    {% endif %}
    
    PermissionRequiredMixin
    from django.contrib.auth.mixins import PermissionRequiredMixin
    

    自定义PermissionRequiredMixin

    创建仅限

    在模型的 Meta 类中定制权限

    class Meta:
        permissions = (
            ("modify_user_status", "修改用户状态"),
            ("modify_user_passwd", "修改用户密码"),
        )
    

    直接创建权限

    from resources.models import Idc
    from django.contrib.auth.models import Group, Permission
    from django.contrib.contenttypes.models import ContentType
    content_type = ContentType.objects.get_for_model(Idc)
    permission = Permission.objects.create(codename='can_view',
                                           name='Can view Idc',
                                           content_type=content_type)
    

    django的权限

    INSTALLED_APPS = [
        ...
        'django.contrib.auth',
        ...
    

    每次migarate的时候,默认给每个model绑定了这些权限

    view
    add
    change
    delete
    

    权限记录在保存在auth_permission表里

    content_type对应的是model

    用户

    https://docs.djangoproject.com/en/2.1/topics/auth/default/#user-objects

    • 创建用户
    • 改密码
    • 认证用户
    • 权限和授权

    创建用户

    >>> from django.contrib.auth.models import User
    >>> user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')
    
    # At this point, user is a User object that has already been saved
    # to the database. You can continue to change its attributes
    # if you want to change other fields.
    >>> user.last_name = 'Lennon'
    >>> user.save()
    

    创建好后,需要将staff改下才能登陆

    创建超级用户

    $ python manage.py createsuperuser --username=joe --email=joe@example.com
    
  • 相关阅读:
    Redis缓存穿透、缓存雪崩、redis并发问题 并发竞争key的解决方案 (阿里)
    CAP原则 (阿里)
    分布式系统一致性问题解决实战(阿里) 异步解耦+消息队列可作为分布式系统满足最终一致性的优秀方案
    高并发&高可用系统的常见应对策略 秒杀等-(阿里)
    Redis的内存回收策略和内存上限(阿里)
    如何保证MQ的顺序性?比如Kafka
    spring的controller默认是单例还是多例
    HashMap线程不安全的体现
    TCP的三次握手与四次挥手
    常见排序算法及对应的时间复杂度和空间复杂度
  • 原文地址:https://www.cnblogs.com/iiiiiher/p/9925830.html
Copyright © 2020-2023  润新知