欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

django認(rèn)證系統(tǒng)實(shí)現(xiàn)自定義權(quán)限管理的方法

 更新時(shí)間:2018年07月16日 10:17:58   作者:le31ei  
這篇文章主要介紹了django認(rèn)證系統(tǒng)實(shí)現(xiàn)自定義權(quán)限管理的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

本文記錄使用django自帶的認(rèn)證系統(tǒng)實(shí)現(xiàn)自定義的權(quán)限管理系統(tǒng),包含組權(quán)限、用戶(hù)權(quán)限等實(shí)現(xiàn)。

0x01. django認(rèn)證系統(tǒng)

django自帶的認(rèn)證系統(tǒng)能夠很好的實(shí)現(xiàn)如登錄、登出、創(chuàng)建用戶(hù)、創(chuàng)建超級(jí)用戶(hù)、修改密碼等復(fù)雜操作,并且實(shí)現(xiàn)了用戶(hù)組、組權(quán)限、用戶(hù)權(quán)限等復(fù)雜結(jié)構(gòu),使用自帶的認(rèn)證系統(tǒng)就能幫助我們實(shí)現(xiàn)自定義的權(quán)限系統(tǒng)達(dá)到權(quán)限控制的目的。

0x02. 認(rèn)證系統(tǒng)User對(duì)象

User對(duì)象顧名思義即為表示用戶(hù)的對(duì)象,里面的屬性包括:

  1. username
  2. password
  3. email
  4. first_name
  5. last_name
  6. is_superuser
  7. is_active

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

class models.User

User 對(duì)象具有如下字段:

username
必選。少于等于30個(gè)字符。 用戶(hù)名可以包含字母、數(shù)字、_、@、+、.和- 字符。

first_name
可選。 少于等于30個(gè)字符。

last_name
可選。少于30個(gè)字符。

email
可選。郵箱地址。

password
必選。 密碼的哈希及元數(shù)據(jù)。(Django 不保存原始密碼)。原始密碼可以無(wú)限長(zhǎng)而且可以包含任意字符。參見(jiàn)密碼相關(guān)的文檔。

groups
與Group 之間的多對(duì)多關(guān)系。

user_permissions
與Permission 之間的多對(duì)多關(guān)系。

is_staff
布爾值。指示用戶(hù)是否可以訪(fǎng)問(wèn)Admin 站點(diǎn)。

is_active
布爾值。指示用戶(hù)的賬號(hào)是否激活。

is_superuser
布爾值。只是這個(gè)用戶(hù)擁有所有的權(quán)限而不需要給他們分配明確的權(quán)限。

last_login
用戶(hù)最后一次登錄的時(shí)間。

date_joined
賬戶(hù)創(chuàng)建的時(shí)間。當(dāng)賬號(hào)創(chuàng)建時(shí),默認(rèn)設(shè)置為當(dāng)前的date/time。

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

# 注冊(cè)操作
from django.contrib.auth.models import User

try:
 User.objects.get(username=username)
 data = {'code': '-7', 'info': u'用戶(hù)已存在'}
except User.DoesNotExist:
 user = User.objects.create_user(username, email, password)
 if user is not None:
  user.is_active = False
  user.save()

該過(guò)程中密碼字段會(huì)自動(dòng)加密存儲(chǔ)。無(wú)需關(guān)注過(guò)多細(xì)節(jié)。

0x03. 登錄登出用戶(hù)

創(chuàng)建好用戶(hù)后,就是登錄及登出了,django認(rèn)證系統(tǒng)提供了login()logout()函數(shù),能夠自動(dòng)登錄登出,并且修改session值,非常方便。驗(yàn)證用戶(hù)身份使用authenticate函數(shù)能自動(dòng)進(jìn)行password字段的hash比對(duì)。

具體實(shí)現(xiàn)代碼如下:

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) # 登錄用戶(hù)
   data = {'code': '1', 'info': u'登錄成功', 'url': 'index'}
  else:
   data = {'code': '-5', 'info': u'用戶(hù)未激活'}
 else:
   data = {'code': '-4', 'info': u'用戶(hù)名或密碼錯(cuò)誤'}
else:
 data = {'code': '-6', 'info': u'驗(yàn)證碼錯(cuò)誤'}

登出操作如下:

from django.contrib.auth import authenticate, login, logout

def logout_system(request):
  """
  退出登錄
  :param request:
  :return:
  """
  logout(request)
  return HttpResponseRedirect('/')

0x04. login_required裝飾器

通過(guò)該裝飾器能夠使視圖函數(shù)首先判斷用戶(hù)是否登錄,如果未登錄會(huì)跳到默認(rèn)在settings.py設(shè)置的LOGIN_URL參數(shù)對(duì)應(yīng)的url,如:LOGIN_URL = '/'。使用方法如下所示:

from django.contrib.auth.decorators import login_required

@login_required
def user_index(request):
  """
  用戶(hù)管理首頁(yè)
  :param request:
  :return:
  """
  if request.method == "GET":
    # 用戶(hù)視圖實(shí)現(xiàn)

0x05. 用戶(hù)組及權(quán)限分配

組對(duì)象包含的字段只有name,但是外鍵了幾張表,能夠與user、permissions,產(chǎn)生多對(duì)多的關(guān)系,我在自定義權(quán)限實(shí)現(xiàn)中,采用的是權(quán)限寫(xiě)死的方法,添加用戶(hù)組權(quán)限。

創(chuàng)建組的函數(shù)采用Group.objects.create(name=xxx),就能實(shí)現(xiàn)了。當(dāng)然也跟創(chuàng)建用戶(hù)一樣,需要先判斷是否組名已經(jīng)存在。

創(chuàng)建好組名后,下一步就需要為每個(gè)組分配權(quán)限了,從前端提交過(guò)來(lái)的權(quán)限列表,然后后端采用groups.permissions.add(permission)的方式依次將權(quán)限添加進(jìn)組。

添加完組權(quán)限后,最后一步是將組名添加進(jìn)用戶(hù)屬性,區(qū)分用戶(hù)屬于哪個(gè)組。

具體實(shí)現(xiàn)代碼如下:

# 創(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))

0x06. 權(quán)限模型及權(quán)限控制

在上一點(diǎn)中用到的Permission.objects.get(codename='access_user_manage')是通過(guò)權(quán)限模型創(chuàng)建,需要在models中創(chuàng)建一個(gè)權(quán)限類(lèi),然后在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'用戶(hù)管理'),
    )

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

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

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

同時(shí)在前端模板頁(yè)面中也需要進(jìn)行權(quán)限控制,前端要獲取request對(duì)象的話(huà),后端返回就需要使用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" >用戶(hù)管理</a></li>
 {% endif %}
</ul>
</li>
{% endif %}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 簡(jiǎn)單談?wù)凱ython中的閉包

    簡(jiǎn)單談?wù)凱ython中的閉包

    一般來(lái)說(shuō)閉包這個(gè)概念在很多語(yǔ)言中都有涉及,簡(jiǎn)單說(shuō),閉包就是根據(jù)不同的配置信息得到不同的結(jié)果,下面我們來(lái)專(zhuān)門(mén)講下在Python中的閉包
    2016-11-11
  • python實(shí)現(xiàn)比較文件內(nèi)容異同

    python實(shí)現(xiàn)比較文件內(nèi)容異同

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)比較文件內(nèi)容異同,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Windows下Anaconda下載安裝與配置教程分享

    Windows下Anaconda下載安裝與配置教程分享

    這篇文章主要介紹了Windows下Anaconda下載安裝與配置教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Python答題卡識(shí)別并給出分?jǐn)?shù)的實(shí)現(xiàn)代碼

    Python答題卡識(shí)別并給出分?jǐn)?shù)的實(shí)現(xiàn)代碼

    本文帶領(lǐng)大家學(xué)習(xí)Python答題卡識(shí)別并給出分?jǐn)?shù)的實(shí)現(xiàn)代碼,代碼實(shí)現(xiàn)思路清晰,簡(jiǎn)單易懂,Python識(shí)別答題卡相關(guān)知識(shí)感興趣的朋友一起看看吧
    2021-06-06
  • pygame+opencv實(shí)現(xiàn)讀取視頻幀的方法示例

    pygame+opencv實(shí)現(xiàn)讀取視頻幀的方法示例

    由于pygame.movie.Movie.play()只支持MPEG格式的視頻,所以決定使用與opencv讀取視頻幀的畫(huà)面,本文就詳細(xì)的介紹了pygame+opencv實(shí)現(xiàn)讀取視頻幀,感興趣的可以了解一下
    2021-12-12
  • Python切換pip源兩種方法(解決pip?install慢)

    Python切換pip源兩種方法(解決pip?install慢)

    這篇文章主要給大家介紹了關(guān)于Python切換pip源兩種方法(解決pip?install慢),我總結(jié)的這幾種更換pip源的常用方式,希望可以幫助您成功配置國(guó)內(nèi)源,解決安裝Python包速度慢的問(wèn)題,需要的朋友可以參考下
    2023-11-11
  • Python Pymysql實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)的示例

    Python Pymysql實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)的示例

    本文主要介紹了Python Pymysql實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • 在自動(dòng)化中用python實(shí)現(xiàn)鍵盤(pán)操作的方法詳解

    在自動(dòng)化中用python實(shí)現(xiàn)鍵盤(pán)操作的方法詳解

    今天小編就為大家分享一篇在自動(dòng)化中用python實(shí)現(xiàn)鍵盤(pán)操作的方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • Python Numpy之linspace用法說(shuō)明

    Python Numpy之linspace用法說(shuō)明

    這篇文章主要介紹了Python Numpy之linspace用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • 用Python進(jìn)行基礎(chǔ)的函數(shù)式編程的教程

    用Python進(jìn)行基礎(chǔ)的函數(shù)式編程的教程

    這篇文章主要介紹了用Python進(jìn)行基礎(chǔ)的函數(shù)式編程的教程,除了面向?qū)ο缶幊桃馔狻ython還可以進(jìn)行簡(jiǎn)單的不依賴(lài)外部變量的函數(shù)式編程,本文介紹了其中的一些基礎(chǔ),需要的朋友可以參考下
    2015-03-03

最新評(píng)論