1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      使用django怎么實現(xiàn)自定義權(quán)限管理-創(chuàng)新互聯(lián)

      這篇文章給大家介紹使用django怎么實現(xiàn)自定義權(quán)限管理,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

      成都創(chuàng)新互聯(lián)公司堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站建設(shè)、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的北辰網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

      現(xiàn)。

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

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

      0x02. 認(rèn)證系統(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)建時,默認(rèn)設(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異常,在這個異常中進(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()

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

      0x03. 登錄登出用戶

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

      具體實現(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) # 登錄用戶
        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ù)首先判斷用戶是否登錄,如果未登錄會跳到默認(rèn)在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)限添加進(jìn)組。

      添加完組權(quán)限后,最后一步是將組名添加進(jì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中進(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'用戶管理'),
        )

      運行后,會自動在數(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:
       """

      同時在前端模板頁面中也需要進(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 %}
      
       
        
        站點管理 
       
       
       {% if request.user.is_superuser or 'webcenter.access_log' in request.user.get_group_permissions %}
        
    2. 日志管理
    3.  {% endif %}  {% if request.user.is_superuser or 'webcenter.access_role_manage' in request.user.get_group_permissions %}   
    4. 角色管理
    5.  {% endif %}  {% if request.user.is_superuser or 'webcenter.access_user_manage' in request.user.get_group_permissions %}   
    6. 用戶管理
    7.  {% endif %} {% endif %}

      關(guān)于使用django怎么實現(xiàn)自定義權(quán)限管理就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。


      網(wǎng)頁題目:使用django怎么實現(xiàn)自定義權(quán)限管理-創(chuàng)新互聯(lián)
      URL分享:http://www.ef60e0e.cn/article/cshpch.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        皮山县| 五家渠市| 茶陵县| 泸州市| 卫辉市| 新龙县| 徐水县| 依兰县| 英吉沙县| 镇原县| 平安县| 仙游县| 肥东县| 吉隆县| 三台县| 耒阳市| 都匀市| 濮阳县| 五河县| 紫阳县| 扶沟县| 山西省| 开封县| 上思县| 西安市| 桃园县| 抚顺县| 漳平市| 英德市| 宁远县| 仁化县| 从江县| 大渡口区| 达州市| 都江堰市| 延边| 郑州市| 民乐县| 博客| 平遥县| 克东县|