目录
整体思路
1.使用django自带的后台功能添加组和用户
启动django服务后,在Django终端添加一个账号
在网页上输入网址,跳转到登录页面
Groups
新增组,设置组的名字,对应的权限Save即可
Users
将用户绑定组或单独设置权限
2.用户的登录绑定
3.用户权限的验证
这篇文章写的比较急,很多地方不够完善,博主会不断更新和完善这篇文章,如有不懂的可以直接评论找博主,博主看到就会回答
整体思路
1.使用django后台添加用户和权限
2.用户登录绑定
3.编写中间件进行访问网页的验证
1.使用django自带的后台功能添加组和用户
启动django服务后,在Django终端添加一个账号
python manage.py createsuperuser
按照提示一个一个输入即可
密码不要设置太简单,这里为了演示就随便设置了
在网页上输入网址,跳转到登录页面
http://127.0.0.1:8000/admin/login
这里主要介绍一下两个功能,Groups和Users
这里简单介绍一下groups和users,user对应的就是每一个账号,grouop对应的一组,一组里面可以包含多个账号,只要给组设置了权限,该组下的所有账号都有对应的权限,也可以为每一个账号设置不同的权限
Groups
新增组,设置组的名字,对应的权限Save即可
这里演示添加的组名为【group1】,后面会用到
Users
对所有账号进行管理
将用户绑定组或单独设置权限
已当前账号111为演示,将111账号添加到group1下
至此通过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/': '对应的组名',
}