最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django權(quán)限系統(tǒng)auth模塊用法解讀

 更新時(shí)間:2023年05月10日 14:32:14   作者:菲宇  
這篇文章主要介紹了Django權(quán)限系統(tǒng)auth模塊用法解讀,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

認(rèn)證系統(tǒng)auth 

auth模塊是Django提供的標(biāo)準(zhǔn)權(quán)限管理系統(tǒng),可以提供用戶身份認(rèn)證, 用戶組和權(quán)限管理。auth可以和admin模塊配合使用, 快速建立網(wǎng)站的管理系統(tǒng)。

auth模塊

from django.contrib import auth

django.contrib.auth中提供了許多方法,這里主要介紹其中的三個(gè):

1 authenticate()   

提供了用戶認(rèn)證,即驗(yàn)證用戶名以及密碼是否正確,一般需要username  password兩個(gè)關(guān)鍵字參數(shù)

如果認(rèn)證信息有效,會返回一個(gè)  User  對象。authenticate()會在User 對象上設(shè)置一個(gè)屬性標(biāo)識那種認(rèn)證后端認(rèn)證了該用戶,且該信息在后面的登錄過程中是需要的。當(dāng)我們試圖登陸一個(gè)從數(shù)據(jù)庫中直接取出來不經(jīng)過authenticate()的User對象會報(bào)錯(cuò)的??!

user = authenticate(username='someone',password='somepassword')

2 login(HttpRequest, user)

該函數(shù)接受一個(gè)HttpRequest對象,以及一個(gè)認(rèn)證了的User對象

此函數(shù)使用django的session框架給某個(gè)已認(rèn)證的用戶附加上session id等信息。

from django.contrib.auth import authenticate, login
def my_view(request):
? username = request.POST['username']
? password = request.POST['password']
? user = authenticate(username=username, password=password)
? if user is not None:
? ? login(request, user)
? ? # Redirect to a success page.
? ? ...
? else:
? ? # Return an 'invalid login' error message.
? ? ...

3 logout(request) 注銷用戶

from django.contrib.auth import logout
def logout_view(request):
? logout(request)
? # Redirect to a success page.

該函數(shù)接受一個(gè)HttpRequest對象,無返回值。當(dāng)調(diào)用該函數(shù)時(shí),當(dāng)前請求的session信息會全部清除。該用戶即使沒有登錄,使用該函數(shù)也不會報(bào)錯(cuò)。

4  is_authenticated()

要求:

1  用戶登陸后才能訪問某些頁面,

2  如果用戶沒有登錄就訪問該頁面的話直接跳到登錄頁面

3  用戶在跳轉(zhuǎn)的登陸界面中完成登陸后,自動(dòng)訪問跳轉(zhuǎn)到之前訪問的地址

// 方法一
def my_view(request):
? if not request.user.is_authenticated():
? ? return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
# django已經(jīng)為我們設(shè)計(jì)好了一個(gè)用于此種情況的裝飾器:login_requier
from django.contrib.auth.decorators import login_required
@login_required
def my_view(request):
? ...

若用戶沒有登錄,則會跳轉(zhuǎn)到django默認(rèn)的 登錄URL '/accounts/login/ ' (這個(gè)值可以在settings文件中通過LOGIN_URL進(jìn)行修改)。并傳遞  當(dāng)前訪問url的絕對路徑 (登陸成功后,會重定向到該路徑)。

User對象

User 對象屬性:username, password(必填項(xiàng))password用哈希算法保存到數(shù)據(jù)庫

  • is_staff : 用戶是否擁有網(wǎng)站的管理權(quán)限.
  • is_active : 是否允許用戶登錄, 設(shè)置為``False``,可以不用刪除用戶來禁止 用戶登錄

is_authenticated()

如果是真正的 User 對象,返回值恒為 True 。 用于檢查用戶是否已經(jīng)通過了認(rèn)證。

通過認(rèn)證并不意味著用戶擁有任何權(quán)限,甚至也不檢查該用戶是否處于激活狀態(tài),這只是表明用戶成功的通過了認(rèn)證。 這個(gè)方法很重要, 在后臺用request.user.is_authenticated()判斷用戶是否已經(jīng)登錄,如果true則可以向前臺展示request.user.name

User

User是auth模塊中維護(hù)用戶信息的關(guān)系模式(繼承了models.Model), 數(shù)據(jù)庫中該表被命名為auth_user.

User表的SQL描述:

CREATE TABLE "auth_user" (
? ? "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,?
? ? "password" varchar(128) NOT NULL, "last_login" datetime NULL,?
? ? "is_superuser" bool NOT NULL,?
? ? "first_name" varchar(30) NOT NULL,?
? ? "last_name" varchar(30) NOT NULL,
? ? "email" varchar(254) NOT NULL,?
? ? "is_staff" bool NOT NULL,?
? ? "is_active" bool NOT NULL,
? ? "date_joined" datetime NOT NULL,
? ? "username" varchar(30) NOT NULL UNIQUE
)

User對象顧名思義即為表示用戶的對象,里面的屬性包括以上幾條:

創(chuàng)建好對象后,django會自動(dòng)生成表,表名為auth_user,包含以上字段。具體的api文檔如下所示:

    class models.User
    User 對象具有如下字段:
    username
    必選。少于等于30個(gè)字符。 用戶名可以包含字母、數(shù)字、_、@、+、.和- 字符。
    first_name
    可選。 少于等于30個(gè)字符。
    last_name
    可選。少于30個(gè)字符。
    email
    可選。郵箱地址。
    password
    必選。 密碼的哈希及元數(shù)據(jù)。(Django 不保存原始密碼)。原始密碼可以無限長而且可以包含任意字符。參見密碼相關(guān)的文檔。
    groups
    與Group 之間的多對多關(guān)系。
    user_permissions
    與Permission 之間的多對多關(guān)系。
    is_staff
    布爾值。指示用戶是否可以訪問Admin 站點(diǎn)。
    is_active
    布爾值。指示用戶的賬號是否激活。
    is_superuser
    布爾值。只是這個(gè)用戶擁有所有的權(quán)限而不需要給他們分配明確的權(quán)限。
    last_login
    用戶最后一次登錄的時(shí)間。
    date_joined
    賬戶創(chuàng)建的時(shí)間。當(dāng)賬號創(chuàng)建時(shí),默認(rèn)設(shè)置為當(dāng)前的date/time。

auth模塊提供了很多API管理用戶信息, 在必要的時(shí)候我們可以導(dǎo)入U(xiǎn)ser表進(jìn)行操作, 比如其它表需要與User建立關(guān)聯(lián)時(shí).

from django.contrib.auth.models import User

新建用戶

user = User.objects.create_user(username, email, password)

建立user對象

user.save()

需要調(diào)用save()方法新用戶才會寫入數(shù)據(jù)庫

auth模塊不存儲用戶密碼明文而是存儲一個(gè)Hash值, 比如迭代使用Md5算法.

一般在注冊操作中會用到該方法,實(shí)現(xiàn)注冊一個(gè)用戶,用到的函數(shù)是User.objects.create_user(),在新建用戶的時(shí)候需要判斷用戶是否存在,我的實(shí)現(xiàn)方式是,User.objects.get(username=xxx)去獲取一個(gè)用戶User對象,用try except實(shí)現(xiàn),如果用戶不存在則拋出User.DoesNotExist異常,在這個(gè)異常中進(jìn)行創(chuàng)建用戶的操作。具體代碼如下:

# 注冊操作
from django.contrib.auth.models import User
try:
? User.objects.get(username=username)
? data = {'code': '-7', 'info': u'用戶已存在'}
except User.DoesNotExist:
? user = User.objects.create_user(username, email, password)
? if user is not None:
? ? user.is_active = False
? ? user.save()

認(rèn)證用戶

先導(dǎo)入函數(shù)

from django.contrib.auth import authenticate

使用關(guān)鍵字參數(shù)傳遞賬戶和憑據(jù):

user = authenticate(username=username, password=password)

認(rèn)證用戶的密碼是否有效, 若有效則返回代表該用戶的user對象, 若無效則返回None.

該方法不檢查is_active標(biāo)志位.

修改密碼

用戶需要修改密碼的時(shí)候 首先要讓他輸入原來的密碼 ,如果給定的字符串通過了密碼檢查,返回 True

def change_password(request):
? ? if request.is_ajax():
? ? ? ? data = json.loads(request.POST.get('data'))
? ? ? ? oldPassword = data.get('oldPassword')
? ? ? ? newPassword = data.get('newPassword')
? ? ? ? confirmPassword = data.get('confirmPassword')
? ? ? ? if request.user.check_password(oldPassword): ? ? # 判斷舊密碼是否正確
? ? ? ? ? ? request.user.set_password(newPassword)
? ? ? ? ? ? request.user.save()
? ? ? ? ? ? result = {'status': 0, "info": "密碼修改登錄成功?。?}
? ? ? ? else:
? ? ? ? ? ? result = {'status': 1, "info": "原密碼不正確?。?}
? ? ? ? return HttpResponse(json.dumps(result))
? ? return render(request, 'changepassword.html')

修改密碼是User的實(shí)例方法, 該方法不驗(yàn)證用戶身份:

user.set_password(new_password)

通常該方法需要和authenticate配合使用:

user = auth.authenticate(username=username, password=old_password)
if user is not None:
? ? user.set_password(new_password)
? ? user.save()

登錄

首先import:

from django.contrib.auth import login

login向session中添加SESSION_KEY, 便于對用戶進(jìn)行跟蹤:

'login(request, user)'

login不進(jìn)行認(rèn)證,也不檢查is_active標(biāo)志位, 一般和authenticate配合使用:

user = authenticate(username=username, password=password)
if user is not None:
? ? if user.is_active:
? ? ? ? login(request, user)

在auth/__init__.py中可以看到login的源代碼.

from django.contrib.auth import authenticate, login, logout
# 認(rèn)證操作
ca = Captcha(request)
if ca.validate(captcha_code):
? user = authenticate(username=username, password=password)
? if user is not None:
? ? if user.is_active:
? ? ? # 登錄成功
? ? ? login(request, user) ?# 登錄用戶
? ? ? data = {'code': '1', 'info': u'登錄成功', 'url': 'index'}
? ? else:
? ? ? data = {'code': '-5', 'info': u'用戶未激活'}
? else:
? ? ? data = {'code': '-4', 'info': u'用戶名或密碼錯(cuò)誤'}
else:
? data = {'code': '-6', 'info': u'驗(yàn)證碼錯(cuò)誤'}

退出登錄

logout會移除request中的user信息, 并刷新session:

from django.contrib.auth import logout
def logout_view(request):
? ? logout(request)
from django.contrib.auth import authenticate, login, logout
def logout_system(request):
? ? """
? ? 退出登錄
? ? :param request:
? ? :return:
? ? """
? ? logout(request)
? ? return HttpResponseRedirect('/')

只允許登錄的用戶訪問

@login_required修飾器修飾的view函數(shù)會先通過session key檢查是否登錄, 已登錄用戶可以正常的執(zhí)行操作, 未登錄用戶將被重定向到login_url指定的位置.

若未指定login_url參數(shù), 則重定向到settings.LOGIN_URL

from django.contrib.auth.decorators import login_required
@login_required(login_url='/accounts/login/')
def my_view(request):
? ? ...from django.contrib.auth.decorators import login_required
@login_required
def user_index(request):
? ? """
? ? 用戶管理首頁
? ? :param request:
? ? :return:
? ? """
? ? if request.method == "GET":
? ? ? ? # 用戶視圖實(shí)現(xiàn)

Group

django.contrib.auth.models.Group定義了用戶組的模型, 每個(gè)用戶組擁有id和name兩個(gè)字段, 該模型在數(shù)據(jù)庫被映射為auth_group數(shù)據(jù)表。

User對象中有一個(gè)名為groups的多對多字段, 多對多關(guān)系由auth_user_groups數(shù)據(jù)表維護(hù)。Group對象可以通過user_set反向查詢用戶組中的用戶。

我們可以通過創(chuàng)建刪除Group對象來添加或刪除用戶組。

# add
group = Group.objects.create(name=group_name)
group.save()
# del
group.delete()

我們可以通過標(biāo)準(zhǔn)的多對多字段操作管理用戶與用戶組的關(guān)系:

  • 用戶加入用戶組user.groups.add(group)或group.user_set.add(user)
  • 用戶退出用戶組user.groups.remove(group)或group.user_set.remove(user)
  • 用戶退出所有用戶組user.groups.clear()
  • 用戶組中所有用戶退出組group.user_set.clear()
# 創(chuàng)建組
try:
? ? Group.objects.get(name=role_name)
? ? data = {'code': -7, 'info': u'組名已存在'}
except Group.DoesNotExist:
? ? groups = Group.objects.create(name=role_name)
? ? if log_manage == 'true':
? ? ? ? permission = Permission.objects.get(codename='access_log')
? ? ? ? groups.permissions.add(permission)
? ? if role_manage == 'true':
? ? ? ? permission = Permission.objects.get(codename='access_role_manage')
? ? ? ? groups.permissions.add(permission)
? ? if user_manage == 'true':
? ? ? ? permission = Permission.objects.get(codename='access_user_manage')
? ? ? ? groups.permissions.add(permission)
? ? if get_users is not None:
? ? ? ? for user in get_users:
? ? ? ? ? ? # 每個(gè)user添加組屬性
? ? ? ? ? ? db_user = get_object_or_404(User, username=user)
? ? ? ? ? ? db_user.groups.add(groups)
? ? ? ? ? ? data = {'code': 1, 'info': u'添加成功'}
? ? return HttpResponse(json.dumps(data))

Permission

Django的auth系統(tǒng)提供了模型級的權(quán)限控制, 即可以檢查用戶是否對某個(gè)數(shù)據(jù)表擁有增(add), 改(change), 刪(delete)權(quán)限。

auth系統(tǒng)無法提供對象級的權(quán)限控制, 即檢查用戶是否對數(shù)據(jù)表中某條記錄擁有增改刪的權(quán)限。如果需要對象級權(quán)限控制可以使用django-guardian.

假設(shè)在博客系統(tǒng)中有一張article數(shù)據(jù)表管理博文, auth可以檢查某個(gè)用戶是否擁有對所有博文的管理權(quán)限, 但無法檢查用戶對某一篇博文是否擁有管理權(quán)限。

檢查用戶權(quán)限

user.has_perm方法用于檢查用戶是否擁有操作某個(gè)模型的權(quán)限:

user.has_perm('blog.add_article')
user.has_perm('blog.change_article')
user.has_perm('blog.delete_article')

上述語句檢查用戶是否擁有blog這個(gè)app中article模型的添加權(quán)限, 若擁有權(quán)限則返回True。

has_perm僅是進(jìn)行權(quán)限檢查, 即是用戶沒有權(quán)限它也不會阻止程序員執(zhí)行相關(guān)操作。

permission_required修飾器可以代替has_perm并在用戶沒有相應(yīng)權(quán)限時(shí)重定向到登錄頁或者拋出異常。

# permission_required(perm[, login_url=None, raise_exception=False])
@permission_required('blog.add_article')
def post_article(request):
? ? pass

每個(gè)模型默認(rèn)擁有增(add), 改(change), 刪(delete)權(quán)限。在django.contrib.auth.models.Permission模型中保存了項(xiàng)目中所有權(quán)限。

該模型在數(shù)據(jù)庫中被保存為auth_permission數(shù)據(jù)表。每條權(quán)限擁有id ,name , content_type_id, codename四個(gè)字段。

管理用戶權(quán)限

User和Permission通過多對多字段user.user_permissions關(guān)聯(lián),在數(shù)據(jù)庫中由auth_user_user_permissions數(shù)據(jù)表維護(hù)。

  • 添加權(quán)限: user.user_permissions.add(permission)
  • 刪除權(quán)限: user.user_permissions.delete(permission)
  • 清空權(quán)限: user.user_permissions.clear()

用戶擁有他所在用戶組的權(quán)限, 使用用戶組管理權(quán)限是一個(gè)更方便的方法。Group中包含多對多字段permissions, 在數(shù)據(jù)庫中由auth_group_permissions數(shù)據(jù)表維護(hù)。

  • 添加權(quán)限: group.permissions.add(permission)
  • 刪除權(quán)限: group.permissions.delete(permission)
  • 清空權(quán)限: group.permissions.clear()

自定義權(quán)限

在定義Model時(shí)可以使用Meta自定義權(quán)限:

class Discussion(models.Model):
? ...
? class Meta:
? ? ? permissions = (
? ? ? ? ? ("create_discussion", "Can create a discussion"),
? ? ? ? ? ("reply_discussion", "Can reply discussion"),
? ? ? )

在上一點(diǎn)中用到的Permission.objects.get(codename='access_user_manage')是通過權(quán)限模型創(chuàng)建,需要在models中創(chuàng)建一個(gè)權(quán)限類,然后在meta中進(jìn)行定義codename。

class AccessControl(models.Model):
? ? """
? ? 自定義權(quán)限控制
? ? """
? ? class Meta:
? ? ? ? permissions = (
? ? ? ? ? ? ('access_dashboard', u'控制面板'),
? ? ? ? ? ? ('access_log', u'日志管理'),
? ? ? ? ? ? ('access_role_manage', u'角色管理'),
? ? ? ? ? ? ('access_user_manage', u'用戶管理'),
? ? ? ? )

運(yùn)行后,會自動(dòng)在數(shù)據(jù)庫中創(chuàng)建相應(yīng)的表,并且插入數(shù)據(jù)。

在創(chuàng)建好權(quán)限之后,下一步就是在各個(gè)視圖中插入權(quán)限控制代碼了。permission_required(),參數(shù)為當(dāng)前應(yīng)用名.codename。這樣就能控制用戶訪問,如果用戶非法訪問則會清空session退出登錄。

@permission_required('webcenter.access_role_manage')
@login_required
def role_index(request):
? ? """
? ? 角色管理首頁
? ? :param request:
? ? :return:
? ? """

同時(shí)在前端模板頁面中也需要進(jìn)行權(quán)限控制,前端要獲取request對象的話,后端返回就需要使用render函數(shù),render(request,xxx,xxx),具體代碼就如下:

{% if request.user.is_superuser or 'webcenter.access_user_manage' in request.user.get_group_permissions or 'webcenter.access_role_manage' in request.user.get_group_permissions or 'webcenter.access_log' in request.user.get_group_permissions ?%}
<li class="treeview">
? <a href="#" rel="external nofollow"  rel="external nofollow" >
? ? ? <i class="fa fa-fw fa-skyatlas"></i>
? ? ? <span>站點(diǎn)管理</span> <i class="fa fa-angle-left pull-right"></i>
? </a>
? <ul class="treeview-menu">
? {% if request.user.is_superuser or 'webcenter.access_log' in request.user.get_group_permissions %}
? ? ? <li><a href="#" rel="external nofollow"  rel="external nofollow"  id="log_view">日志管理</a></li>
? {% endif %}
? {% if request.user.is_superuser or 'webcenter.access_role_manage' in request.user.get_group_permissions %}
? ? ? <li><a href="/role/index/" rel="external nofollow" >角色管理</a></li>
? {% endif %}
? {% if request.user.is_superuser or 'webcenter.access_user_manage' in request.user.get_group_permissions %}
? ? ? <li><a href="/user/index/" rel="external nofollow" >用戶管理</a></li>
? {% endif %}
</ul>
</li>
{% endif %}

判斷用戶是否擁有自定義權(quán)限:

user.has_perm('blog.create_discussion')

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python常用算法學(xué)習(xí)基礎(chǔ)教程

    Python常用算法學(xué)習(xí)基礎(chǔ)教程

    這篇文章主要學(xué)習(xí)Python常用算法,Python常用排序算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一
    2017-04-04
  • python閉包的實(shí)例詳解

    python閉包的實(shí)例詳解

    在本篇文章里小編給大家整理的是一篇關(guān)于python閉包的實(shí)例詳解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-10-10
  • Python跨平臺路徑格式不一致的處理方法

    Python跨平臺路徑格式不一致的處理方法

    你是不是也遇到過 Python 跨平臺路徑格式不一致的問題?在 Windows、macOS 和 Linux 之間切換時(shí),路徑格式的不同簡直讓人頭疼,今天,我們就來徹底解決這個(gè)問題,并告訴你在實(shí)際開發(fā)和打包時(shí),哪種方法更好用,需要的朋友跟著小編一起來看看吧
    2025-04-04
  • Tensorflow實(shí)現(xiàn)部分參數(shù)梯度更新操作

    Tensorflow實(shí)現(xiàn)部分參數(shù)梯度更新操作

    今天小編就為大家分享一篇Tensorflow實(shí)現(xiàn)部分參數(shù)梯度更新操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • Python利用matplotlib畫出漂亮的分析圖表

    Python利用matplotlib畫出漂亮的分析圖表

    這篇文章主要介紹了Python利用matplotlib畫出漂亮的分析圖表,文章首先引入數(shù)據(jù)集展開詳情,需要的朋友可以參考一下
    2022-07-07
  • Python連接SQLite數(shù)據(jù)庫并進(jìn)行增冊改查操作方法詳解

    Python連接SQLite數(shù)據(jù)庫并進(jìn)行增冊改查操作方法詳解

    這篇文章主要介紹了Python對SQLite數(shù)據(jù)庫進(jìn)行增冊改查操作方法詳解,需要的朋友可以參考下
    2020-02-02
  • PyQt5 控件字體樣式等設(shè)置的實(shí)現(xiàn)

    PyQt5 控件字體樣式等設(shè)置的實(shí)現(xiàn)

    這篇文章主要介紹了PyQt5 控件字體樣式等設(shè)置的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • python?nonlocal的用法詳解

    python?nonlocal的用法詳解

    這篇文章主要給大家介紹了關(guān)于python?nonlocal用法的相關(guān)資料,最近在python學(xué)習(xí)中遇到了nonlocal關(guān)鍵字但是感到困惑,于是記錄nonlocal關(guān)鍵字用法,需要的朋友可以參考下
    2023-10-10
  • python實(shí)現(xiàn)飛機(jī)大戰(zhàn)(面向過程)

    python實(shí)現(xiàn)飛機(jī)大戰(zhàn)(面向過程)

    這篇文章主要為大家詳細(xì)介紹了python面向過程實(shí)現(xiàn)飛機(jī)大戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Django通過設(shè)置CORS解決跨域問題

    Django通過設(shè)置CORS解決跨域問題

    這篇文章主要介紹了Django 通過設(shè)置CORS解決跨域問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11

最新評論

张家界市| 随州市| 沂南县| 宝鸡市| 三门县| 辽源市| 全椒县| 贡觉县| 光山县| 宜丰县| 屏山县| 迭部县| 卓尼县| 宝丰县| 辽阳县| 丘北县| 明溪县| 通化市| 涪陵区| 忻州市| 河源市| 抚州市| 绥江县| 临桂县| 汤阴县| 正安县| 乌兰察布市| 绩溪县| 金堂县| 太和县| 武穴市| 潞西市| 城市| 屯门区| 海伦市| 丹江口市| 巨鹿县| 五大连池市| 宁夏| 荥阳市| 九江市|