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

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

 更新時間:2019年08月28日 11:25:44   作者:le31ei  
今天小編就為大家分享一篇django認證系統(tǒng)實現(xiàn)自定義權(quán)限管理的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

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

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

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

0x02. 認證系統(tǒng)User對象

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

username 
password 
email 
first_name 
last_name 
is_superuser 
is_active

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

class models.User

User 對象具有如下字段:

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

first_name 
可選。 少于等于30個字符。

last_name 
可選。少于30個字符。

email 
可選。郵箱地址。

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

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

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

is_staff 
布爾值。指示用戶是否可以訪問Admin 站點。

is_active 
布爾值。指示用戶的賬號是否激活。

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

last_login 
用戶最后一次登錄的時間。

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

一般在注冊操作中會用到該方法,實現(xiàn)注冊一個用戶,用到的函數(shù)是User.objects.create_user(),在新建用戶的時候需要判斷用戶是否存在,我的實現(xiàn)方式是,User.objects.get(username=xxx)去獲取一個用戶User對象,用try except實現(xiàn),如果用戶不存在則拋出User.DoesNotExist異常,在這個異常中進行創(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()

該過程中密碼字段會自動加密存儲。無需關(guān)注過多細節(jié)。

0x03. 登錄登出用戶

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

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

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

# 認證操作
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'用戶名或密碼錯誤'}
else:
 data = {'code': '-6', 'info': u'驗證碼錯誤'}

登出操作如下:

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

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

0x04. login_required裝飾器

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

from django.contrib.auth.decorators import login_required

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

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

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

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

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

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

具體實現(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:
   # 每個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)限控制

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

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

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

在創(chuàng)建好權(quán)限之后,下一步就是在各個視圖中插入權(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:
 """

同時在前端模板頁面中也需要進行權(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>站點管理</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 %}

以上這篇django認證系統(tǒng)實現(xiàn)自定義權(quán)限管理的方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于Python實現(xiàn)人臉識別相似度對比功能

    基于Python實現(xiàn)人臉識別相似度對比功能

    人臉識別技術(shù)是一種通過計算機對人臉圖像進行分析和處理,從而實現(xiàn)自動識別和辨認人臉的技術(shù),隨著計算機視覺和模式識別領(lǐng)域的快速發(fā)展,人臉識別技術(shù)取得了長足的進步,本文給大家介紹了基于Python實現(xiàn)人臉識別相似度對比功能,感興趣的朋友可以參考下
    2024-01-01
  • 從0開始的Python學(xué)習(xí)014面向?qū)ο缶幊蹋ㄍ扑])

    從0開始的Python學(xué)習(xí)014面向?qū)ο缶幊蹋ㄍ扑])

    這篇文章主要介紹了Python面向?qū)ο缶幊?,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • python密碼學(xué)周期置換密碼學(xué)習(xí)

    python密碼學(xué)周期置換密碼學(xué)習(xí)

    這篇文章主要為大家介紹了python密碼學(xué)周期置換密碼的學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Python中的自動化測試與質(zhì)量保障詳解

    Python中的自動化測試與質(zhì)量保障詳解

    這篇文章主要介紹了Python在軟件開發(fā)中自動化測試和質(zhì)量保障的重要性,以及如何使用Python的測試框架如unittest和pytest進行測試,它還討論了編寫高效的測試用例、持續(xù)集成和持續(xù)部署(CI/CD)、測試驅(qū)動開發(fā)(TDD)的實踐以及性能測試和代碼覆蓋率分析等
    2025-01-01
  • Python入門及進階筆記 Python 內(nèi)置函數(shù)小結(jié)

    Python入門及進階筆記 Python 內(nèi)置函數(shù)小結(jié)

    這篇文章主要介紹了Python的內(nèi)置函數(shù)小結(jié),需要的朋友可以參考下
    2014-08-08
  • Python使用gluon/mxnet模塊實現(xiàn)的mnist手寫數(shù)字識別功能完整示例

    Python使用gluon/mxnet模塊實現(xiàn)的mnist手寫數(shù)字識別功能完整示例

    這篇文章主要介紹了Python使用gluon/mxnet模塊實現(xiàn)的mnist手寫數(shù)字識別功能,結(jié)合完整實例形式分析了Python調(diào)用gluon/mxnet模塊識別手寫字的具體實現(xiàn)技巧,需要的朋友可以參考下
    2019-12-12
  • Python字典簡介以及用法詳解

    Python字典簡介以及用法詳解

    字典(dictionary)是除列表意外python之中最靈活的內(nèi)置數(shù)據(jù)結(jié)構(gòu)類型。列表是有序的對象結(jié)合,字典是無序的對象集合。兩者之間的區(qū)別在于:字典當(dāng)中的元素是通過鍵來存取的,而不是通過偏移存取。
    2016-11-11
  • pandas?dataframe獲取所有行名稱與列名稱方法示例

    pandas?dataframe獲取所有行名稱與列名稱方法示例

    這篇文章主要給大家介紹了關(guān)于pandas?dataframe獲取所有行名稱與列名稱的相關(guān)資料,Pandas是Python中用于數(shù)據(jù)分析的非常重要的庫,它提供了多種方法來獲取列名,需要的朋友可以參考下
    2023-09-09
  • Python實現(xiàn)base64編碼

    Python實現(xiàn)base64編碼

    這篇文章介紹了Python實現(xiàn)base64編碼的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Python下的常用下載安裝工具pip的安裝方法

    Python下的常用下載安裝工具pip的安裝方法

    這篇文章主要介紹了Python下的常用下載安裝工具pip的安裝方法,注意在Python2.7.9和3.4以上默認已經(jīng)集成了pip,需要的朋友可以參考下
    2015-11-11

最新評論

基隆市| 玛多县| 本溪市| 凤城市| 冷水江市| 建始县| 时尚| 兴文县| 井陉县| 绩溪县| 阿勒泰市| 曲阜市| 凯里市| 普陀区| 九台市| 望江县| 海阳市| 自治县| 武功县| 腾冲县| 乐山市| 丰台区| 包头市| 张掖市| 商城县| 大同县| 赫章县| 延寿县| 白银市| 遵义县| 溧阳市| 万山特区| 陆丰市| 南乐县| 阿巴嘎旗| 阿拉善左旗| 秦皇岛市| 日喀则市| 邵东县| 剑阁县| 道真|