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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM