Django之权限和分组

## 登录、注销和登录限制:
    ### 登录:在使用authenticate进行验证后,如果验证通过了。
             那么会返回一个user对象,拿到user对象后,可以使用django.contrib.auth.login进行登录。示例代码如下:
                user = authenticate(username=username, password=password)
                if user is not None:
                    if user.is_active:
                        login(request, user)
            实例代码:            
                # 切记:这里一定不要定义login视图函数
                # 可以其他的名字
                from django.contrib.auth import login
                
                def my_login(request):
                    if request.method == 'GET':
                        return render(request,'login.html')
                    else:
                        form = LoginForm(request.POST)
                        if form.is_valid():
                            telephone = form.cleaned_data.get('telephone')
                            password = form.cleaned_data.get('password')
                            remember = form.cleaned_data.get('remember')
                            user = authenticate(request,username=telephone,password=password)
                            if user and user.is_active:
                                login(request,user)
                                if remember:
                                    # 设置为None,则表示使用全局的过期时间
                                    request.session.set_expiry(None)
                                else:
                                    request.session.set_expiry(0)
                                next_url = request.GET.get('next')
                                if next_url:
                                    return redirect(next_url)
                                else:
                                    return HttpResponse('登录成功')
                            else:
                                return HttpResponse('手机号码或者密码错误!')
                        else:
                            print(form.errors)
                            return redirect(reverse('login'))
    ### 注销:注销,或者说退出登录。我们可以通过django.contrib.auth.logout来实现。他会清理掉这个用户的session数据。
            from django.contrib.auth import logout    
            def my_logout(request):
                logout(request)
                return HttpResponse('成功退出登录!')
    ### 登录限制:
    有时候,某个视图函数是需要经过登录后才能访问的。那么我们可以通过django.contrib.auth.decorators.login_required装饰器来实现。示例代码如下:
            from django.contrib.auth.decorators import login_required

            # 在验证失败后,会跳转到/accounts/login/这个url页面
            @login_required(login_url='/accounts/login/')
            def my_view(request):
                pass
## 权限:
    Django中内置了权限的功能。他的权限都是针对表或者说是模型级别的。比如对某个模型上的数据是否可以进行增删改查操作。
    他不能针对数据级别的,比如对某个表中的某条数据能否进行增删改查操作(如果要实现数据级别的,考虑使用django-guardian)。
    创建完一个模型后,针对这个模型默认就有三种权限,分别是增/删/改/。可以在执行完migrate命令后,查看数据库中的auth_permission表中的所有权限。
    ### 通过定义模型添加权限:
        如果我们想要增加新的权限,比如查看某个模型的权限,那么我们可以在定义模型的时候在Meta中定义好。示例代码如下:
            class Article(models.Model):
                title = models.CharField(max_length=100)
                content = models.TextField()
                author = models.ForeignKey(get_user_model(),on_delete=models.CASCADE)

                class Meta:
                    permissions = (
                        ('view_article','can view article'),
                    )
    ### 通过代码添加权限:
        权限都是django.contrib.auth.Permission的实例。这个模型包含三个字段,name、codename以及content_type,
        其中的content_type表示这个permission是属于哪个app下的哪个models。用Permission模型创建权限的代码如下:
            from django.contrib.auth.models import Permission,ContentType
            from .models import Article
            def add_permission(request):
                content_type = ContentType.objects.get_for_model(Article)
                permission = Permission.objects.create(name='可以编辑的权限',codename='edit_article',content_type=content_type)
                return HttpResponse('权限创建成功!')
    ### 用户与权限管理:
        权限本身只是一个数据,必须和用户进行绑定,才能起到作用。User模型和权限之间的管理,可以通过以下几种方式来管理:
            1)myuser.user_permissions.set(permission_list):直接给定一个权限的列表。
            2)myuser.user_permissions.add(permission,permission,...):一个个添加权限。
            3)myuser.user_permissions.remove(permission,permission,...):一个个删除权限。
            4)myuser.user_permissions.clear():清除权限。
            5)myuser.has_perm('<app_name>.<codename>'):判断是否拥有某个权限。权限参数是一个字符串,格式是app_name.codename。
            6)myuser.get_all_permissons():获取所有的权限。
    实例代码:
            from django.contrib.auth.models import Permission
            from .models import Article
            def operate_permission(request):
                user = User.objects.first()
                content_type = ContentType.objects.get_for_model(Article)
                # 提取和文章相关的所有权限
                permissions = Permission.objects.filter(content_type=content_type)
                # 遍历所有权限
                for permission in permissions:
                    print(permission)
                user.user_permissions.set(permissions)        # 将获取到的文章的所有权限赋给user
                user.save()
                # user.user_permissions.clear()               # 清除用户的所有权限
                # *[1,2,3] == 1,2,3    二者等价
                # user.user_permissions.add(*permissions)     # 给用户添加文章的所有权限
                # user.user_permissions.remove(*permissions)  # 移除用户所有权限
                if user.has_perm('front.view_article'):       # 判断用户是否拥有front.view_article这个权限
                    print('这个拥有view_article权限!')
                else:
                    print('这个没有view_article权限!')
                print(user.get_all_permissions())             # 打印用户的所有权限
                return HttpResponse('操作权限的视图!')
    ### 权限限定装饰器:
        使用django.contrib.auth.decorators.permission_required可以非常方便的检查用户是否拥有这个权限,
        如果拥有,那么就可以进入到指定的视图函数中,如果不拥有,那么就会报一个400错误。示例代码如下:
            from django.contrib.auth.decorators import permission_required

            @permission_required('front.view_article')
            def my_view(request):
                ...
## 分组:
    权限有很多,一个模型就有最少三个权限,如果一些用户拥有相同的权限,那么每次都要重复添加。
    这时候分组就可以帮我们解决这种问题了,我们可以把一些权限归类,然后添加到某个分组中,之后再把和把需要赋予这些权限的用户添加到这个分组中,
    就比较好管理了。分组我们使用的是django.contrib.auth.models.Group模型, 每个用户组拥有id和name两个字段,该模型在数据库被映射为auth_group数据表。
### 分组操作:
    1.Group.object.create(group_name):创建分组。
    2.group.permissions:某个分组上的权限。多对多的关系。
        group.permissions.add:添加权限。
        group.permissions.remove:移除权限。
        group.permissions.clear:清除所有权限。
        user.get_group_permissions():获取用户所属组的权限。
    3.user.groups:某个用户上的所有分组。多对多的关系。
## 在模板中使用权限:
    在settings.TEMPLATES.OPTIONS.context_processors下,因为添加了django.contrib.auth.context_processors.auth上下文处理器,
    因此在模板中可以直接通过perms来获取用户的所有权限。示例代码如下:
    #index.html:
        <% if perms.front.add_article %>
            <a href="articel/add">添加文章</add>
        <% endif %>

 

posted @ 2020-04-18 10:48  欧阳少璟  阅读(344)  评论(0编辑  收藏  举报