叶觉的Django之旅【13-auth系统】

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

发布了24 篇原创文章 · 获赞 18 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_39177678/article/details/103919424
今日推荐