Django设置权限管理

目录

整体思路

1.使用django自带的后台功能添加组和用户

        启动django服务后,在Django终端添加一个账号

        在网页上输入网址,跳转到登录页面

        Groups

                新增组,设置组的名字,对应的权限Save即可

        Users

                将用户绑定组或单独设置权限

2.用户的登录绑定

3.用户权限的验证


这篇文章写的比较急,很多地方不够完善,博主会不断更新和完善这篇文章,如有不懂的可以直接评论找博主,博主看到就会回答

整体思路

        1.使用django后台添加用户和权限

        2.用户登录绑定

        3.编写中间件进行访问网页的验证

1.使用django自带的后台功能添加组和用户

        启动django服务后,在Django终端添加一个账号

                python manage.py createsuperuser

                Django设置权限管理_第1张图片

                按照提示一个一个输入即可

                密码不要设置太简单,这里为了演示就随便设置了

        在网页上输入网址,跳转到登录页面

                http://127.0.0.1:8000/admin/login

                Django设置权限管理_第2张图片

                这里主要介绍一下两个功能,Groups和Users

                这里简单介绍一下groups和users,user对应的就是每一个账号,grouop对应的一组,一组里面可以包含多个账号,只要给组设置了权限,该组下的所有账号都有对应的权限,也可以为每一个账号设置不同的权限

                Django设置权限管理_第3张图片

 

        Groups

                新增组,设置组的名字,对应的权限Save即可

                这里演示添加的组名为【group1】,后面会用到

                Django设置权限管理_第4张图片

 

        Users

                对所有账号进行管理

                Django设置权限管理_第5张图片

                将用户绑定组或单独设置权限

                已当前账号111为演示,将111账号添加到group1下

                Django设置权限管理_第6张图片

 

至此通过django后台添加用户和权限就设置完成,但到这只是设置的对应的账号,那如何在页面上实现只有属于该组的才能访问该组的页面的功能呢,下面将介绍代码部分

2.用户的登录绑定

         login(request, user)能够将对应的用户信息给记录,django已经帮我们封装好了,不需要我们再做其他处理,其已经完成这部分功能

from django.shortcuts import render, redirect
from django.utils.timezone import now
from django.contrib.auth import authenticate, login, logout


# 登录页面
def project_login(request):
    if request.method == "GET":
        return render(request, '登录页面的html')
    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(request, username=username, password=password)
    if user is not None:
        login(request, user)
        return render(request, '登录成功后的html')

    return render(request, '登录页面的html')

3.用户权限的验证

        可以在每个view加一个装饰器,但这样太麻烦,不利于维护,这里就已组来设置权限,只要用户属于对应的组就能访问对应的view,这里使用的方法是添加中间件,使其访问任何网页前都先进行判断,是否满足特定的组

        新建一个py文件,输入下面代码,最后记得在settings.py里面注册中间件,注册中间件的顺序也是有讲究的,不明白的话,自行搜索,为了减少篇幅,这里不过多解释

from django.shortcuts import redirect
from django.urls import reverse


class GroupPermissionMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # 在每个请求之前进行组权限判断
        if not self.check_group_permission(request):
            return redirect(reverse('需要返回的url地址(一般是登录页,自行决定)'))

        response = self.get_response(request)
        return response

    def check_group_permission(self, request):
        # 获取当前请求的用户对象
        user = request.user
        # 获取当前请求的路径
        path = request.path

        # 设置需要进行限制访问的路径列表和对应的组
        restricted_paths = {
            'url存在的路径': '对应的组名',
            # 拿刚才创建的group1来举例
            '/only_group1/': 'group1',

            '/jd/': '对应的组名',
            '/vips/': '对应的组名',
        }

        # 检查用户是否属于指定组,并判断是否允许访问特定页面
        for restricted_path, restricted_group in restricted_paths.items():
            if restricted_path in path and not user.groups.filter(name=restricted_group).exists():
                return False

        return True

        代码解释

        例如我要访问的url是http://127.0.0.1:8000/only_group1/show/group1/data/那就可以在设置成下面的样子,只要有url里面存在 【/only_group1/】就需要【group1】该组的权限,如果该用户不属于group1组那就无法访问

        restricted_paths = {
                    'url存在的路径': '对应的组名',
                   # 拿刚才创建的group1来举例
                    '/only_group1/': 'group1',

                    '/jd/': '对应的组名',
                    '/vips/': '对应的组名',
                }

 

你可能感兴趣的:(Django,django,python,后端)