Django 13 admin和auth系统权限问题

Posted xuchengcheng1215

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django 13 admin和auth系统权限问题相关的知识,希望对你有一定的参考价值。

一、auth系统

  auth系统的数据表

技术分享图片

#User:User是auth模块中维护用户信息的关系模式(继承了models.Model), 数据库中该表被命名为auth_user.
#Group:User对象中有一个名为groups的多对多字段, 多对多关系由auth_user_groups数据表维护。Group对象可以通过user_set反向查询用户组中的用户。
#Permission:Django的auth系统提供了模型级的权限控制, 即可以检查用户是否对某个数据表拥有增(add), 改(change), 删(delete)权限。

  User模型常用属性和方法

username           #用户名
email             #邮箱
groups         #多对多的组
user_permissions   #多对多的用户权限
is_staff       #是否是admin的管理员
is_active       #是否激活,判断该用户是否可用
is_superuser     #是否是超级用户
last_login      #上次登录时间
dete_joined       #注册时间
is_authenticated   #是否验证通过了
is_anonymous        #是否是匿名用户
set_password(raw_password) #设置密码,传原生密码进去
check_password(raw_password) #检查密码
has_perm(perm)     #判断用户是否有某个权限
has_perm(perm_list)   #判断用户是否有权限列表中的某个列表

  auth认证系统的功能

create_user #创建用户
authenticate #验证登录
login #记住用户的登录状态
logout #退出登录
is_authenticated #判断用户是否登录
login_required #判断用户是否登录的装饰器

  运用auth系统

from django.shortcuts import render,reverse,redirect
from .forms import RegisterForm,LoginForm
from .models import UserModel
# Create your views here.
from django.contrib.auth.models import User,Permission,Group #从auth系统导入User,Permission,Group 表
from django.contrib.auth import login,logout,authenticate #导入login,logout,authenticate三个方法

def home(request):
    return render(request,login/home.html)

def register(request):
    if request.method == GET:
        return render(request,login/register.html)
    if request.method == POST:
        form = RegisterForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data.get(username)
            password = form.cleaned_data.get(password)
            password_repeat = form.cleaned_data.get(password_repeat)
            email = form.cleaned_data.get(email)
            if password == password_repeat:
                # UserModel.objects.create(username = username,password = password,email = email)
                User.objects.create_user(username=username,password=password,email=email) #用create_user自动给密码加密
                return redirect(reverse(login_login))
            else:
                return redirect(reverse(login_register))
        return redirect(reverse(login_register))
    return redirect(reverse(login_register))

def login_view(request):
    if request.method == GET:
        return render(request,login/login.html)
    if request.method == POST:
        form = LoginForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data.get(username)
            password = form.cleaned_data.get(password)
            # user = UserModel.objects.filter(username=username,password=password)
            user = authenticate(username=username,password=password) #自动验证数据库是否有该用户,自动密码解密
            if user:
                # request.session[‘username‘] = username
                login(request,user) #这种方式实现登录状态
                return redirect(reverse(login_home))
            else:
                return redirect(reverse(login_register))
        return redirect(reverse(login_register))
    else:
        return redirect(reverse(login_register))

def logout_view(request):
    # request.session.flush()
    logout(request) #这种方式实现退出用户
    return render(request,login/login.html)

二、设置blog主页的登录权限

  为了实现在进入博客页面之前必须得登录(就是设置登录权限)

#1、setting.py最后添加
LOGIN_URL = /login/login #把这个页面设置成登录页面,只要没登录就会跳转这个页面

#2、在想要设置权限的地方加上装饰器,在blog的app主页里面添加
from django.contrib.auth.decorators import login_required,permission_required

@login_required #实现登录权限;想要进入这个页面,如果没有登录,就会跳转到默认登录页面
def index(request):
    ‘‘‘
    主页
    ‘‘‘
    return render(request,blog/demo_index.html)

#3、为了用户体验而言,实现登录用户后直接跳转到博客页面而不是主页,从GET里面获取next的url,在保持用户登录状态之后添加代码
            if user:
                # request.session[‘username‘] = username
                login(request,user) #这种方式实现登录状态
                next_url = request.GET.get(next) #为了用户体验而言,实现登录用户后直接跳转到博客页面而不是主页,从GET里面获取next的url
                if next_url: #如果存在,跳转到该url
                    return redirect(next_url)
                return redirect(reverse(login_home))

三、关于权限

#在auth系统当中,django已经为我们提供了一个用户身份验证,用户组和权限管理这些功能, 那么就可以使用它来完善我们现有的这个项目.

  修改用户密码

def test(request):
    xcc = User.objects.filter(username=xuchengcheng).first()
    xcc.set_password(qwe123) #修改密码
    xcc.save()
    return HttpResponse(111111)

  设置添加博客权限

@permission_required(blog.add_blogmodel) #设置app名blog下的add_blogmodel权限,用户必须有这个权限才能添加博客
def add(request):
    ‘‘‘
    添加页
    ‘‘‘
    pass

  添加权限方式

def test(request):
    #给小明一个添加博客的权限
    xiaoming = User.objects.filter(username=xiaoming).first() #获取用户
    add_blog_permission = Permission.objects.filter(codename=add_blog).first() #获取权限
    xiaoming.user_permissions.add(add_blog_permission) #给用户添加权限

    #给组增加一个添加博客的权限,将用户放入这个组里面就可以实现添加博客权限
    g1 = Group()
    g1.name = add_blog_permission #设置组
    g1.save()
    g1.permissions.add(add_blog_permission) #给组添加权限
    g1 = Group.objects.filter(name=add_blog_permission)
    xiaohong = User.objects.filter(username=xiaohong).first()
    print(xiaohong)
    g1.user_set.add(xiaohong) #将小红添加到这个组

    return HttpResponse(111111)

 

技术分享图片

以上是关于Django 13 admin和auth系统权限问题的主要内容,如果未能解决你的问题,请参考以下文章

Django权限系统auth模块详解

Django auth详解

Django - admin后台auth权限

43.Django权限系统auth模块详解

43.Django权限系统auth模块详解

Django中的默认权限/组数据