目录
auth系统
auth 系统是django提供的一套身份认证系统,多用于快速搭建一个后台管理系统。该系统由三张模型表组成 User、Group、Permission。三张表互为多对多关系。
User:存放auth系统的用户信息
Group:存放 auth系统的用户组信息
Permission:存放用户对某数据表可操控的权限信息,可以查看到所有可以授权的权限名称以及调用名称。其中默认存放的权限源于该django项目中所有的models。
auth 注册
从 django.contrib.auth.models 引入 User 模型
使用 create_user(username, password) 来创建普通用户。普通用户所有的权限都需要通过添加获得。
使用 create_superuser() 来创建超级用户,该用户默认具有所有的权限。
from django.contrib.auth.models import User
# 从表单中获取必要信息
username = request.POST.get('username')
password = request.POST.get('password')
password_repeat = request.POST.get('password_repeat')
if password == password_repeat:
# 创建超级用户
User.objects.create_superuser(username=username, password=password)
# 创建普通用户
User.objects.create_user(username=username, password=password)
登录与会话保持:authenticate、login
从 django.contrib.auth 中导入 authenticate, login 来进一步操作
- authenticate(request, username=username, password=password),其中 request 可以省略。authenticate() 认证通过返回一个 django.contrib.auth.models.User 对象,认证失败则返回 None
- login(request, user),会话保持,在 cookie 中创建一个 sessionid
def post(self, request):
username = request.POST.get('username')
password = request.POST.get('password')
user = authenticate(username=username, password=password)
if user:
login(request, user)
使用 request.user 来获取用户信息
request.user:在需要的页面后台使用,通常用于定制页面登录与未登录状态的区别。
返回一个 <class ‘django.utils.functional.SimpleLazyObject’> 对象。可以直接通过上下文传递给前端,以获得一个用户名。
username = request.user
return render(request, 'auth_test/index.html', context={'username': username})
>>> print(username)
yejue2
会话移除:logout
使用logout移除request的会话
def login_out(request):
logout(request)
auth 权限控制,只允许登录后访问
在 django.contrib.auth.decorators 中导入 login_required 装饰器,在需要登录后访问的页面的视图函数中使用。
login_required(login_url):可以直接使用 login_url 参数来指定登录地址,检测到未登录时跳转至该地址。也可以在 settings.py 中指定全局的登录地址。
@login_required(login_url='/auth/index')
def blog_list(request):
# do something...
LOGIN_URL = '/auth/login' # settings.py
附:使用 next 参数来跳转到登录前的页面
通过 login_required() 跳转到登录页面时,会携带一个 next 参数,该参数表示由哪个页面跳转来的。使用 request.GET.get 对其进行捕捉,待 login() 函数保存会话后进行跳转。
class Login(View):
def post(self, request):
next_url = request.GET.get('next')
...
login(request, user)
if next_url:
return redirect(next_url)
permission 具体权限控制
在 django.contrib.auth.decorators 导入 permission_required 装饰器来对需要检查用户是否存在该操作权限页面进行权限控制。
@permission_required(‘Blog.delete_blog’), 其中 Blog 是某一个数据表模型,delete_blog 代表删除权限,下面代码表示检测用户是否对 Blog 有删除权限。
@permission_required('Blog.delete_blog')
def delete(request, blog_id):
Blog.objects.filter(id=blog_id).delete()
return redirect('blog2')
管理用户权限
- User 和 Permission 表是多对多关系。由多对多表auth_user_user_permissions 来对用户具备某种权限进行管理。
- User 和 Permission 使用 user_perssions 字段进行多对多连接。
- 使用该表对用户添加一个权限示例:
def test1(request):
user = User.objects.filter(username='yejue2')[0]
perssion = Permission.objects.filter(codename='delete_blog')[0]
user.user_permissions.add(perssion)
return HttpResponse('添加成功')
- 同理可以使用
#删除权限:
user.user_permissions.delete(permission)
#清空权限:
user.user_permissions.clear()
- 运行之后查看 auth_user_user_permissions 表
mysql> select * from auth_user_user_permissions;
+----+---------+---------------+
| id | user_id | permission_id |
+----+---------+---------------+
| 1 | 3 | 47 |
+----+---------+---------------+
类视图使用上述权限管理装饰器
在类视图中,无法直接使用 @permission_required 和 @login_required,在 django.utils.decorators 中导入 method_decorator 来使用。
@method_decorator(dacorator, name):其中第一个参数为要使用的装饰器,第二个参数为需要装饰的类方法。
# 使用 permission_required
@method_decorator(permission_required('Blog.add_blog'), name='get')
class Write(View):
def get(self, request):
pass
# 使用 login_required
@method_decorator(login_required, name='get')
class Write(View):
def get(self, request):
pass
END