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)

 

posted on 2018-08-10 23:12  许铖铖  阅读(3604)  评论(1编辑  收藏  举报