Django의 권한 시스템

8978 단어
Django에서 기본적인 권한 시스템을 설정했습니다. 모델 동기화 데이터베이스를 정의한 후 모든 라이브러리 아래에'auth'가 있습니다.permission 표.이 테이블에는 모든 권한에 대한 설명(name 필드, can do something, 백엔드 지불 권한 목록에 표시)과 이름(codename 필드, 코드 논리에서 검사 권한이 사용되며, 이 필드는 권한 검증 함수perm check에서'request.user.has perm'방법으로 호출되어 검증을 통과했는지 여부를 판단합니다.)
 
권한 시스템의 기본 논리 프로세스:
  • 1. 사용자가 조작 요청을 할 때 url에 따라 해당하는 시도 함수 처리
  • 를 시도한다.
  • 2. 사용자에게 정보를 되돌려주기 전에 먼저 해당 사용자가 요청한 정보(장식기)를 볼 권한이 있는지 확인
  • 3. 장식기 함수에서 사용자 http가 요청한 URL,method와 파라미터를 모니터링하여 권한을 확정한다
  • 4, 검증이 통과되면 조회 정보를 되돌려줍니다(장식기에 장식된 함수를 실행합니다).인증이 통과되지 않으면 403페이지
  • 로 돌아갑니다.
     
    1、모든 전단에 정보를 되돌려주는views 함수에 장식기를 추가하고,
    from permissions import check_permission #    
    
    @check_permission # , ,
    def customer(request): ,,,

    @check_permission     
    def customer_info(request,customer_id):
      ,,,

    2. 모델에 규칙 추가(데이터베이스에 권한 기록 추가)
    class UserProfile(models.Model):
        user = models.OneToOneField(User)
        name = models.CharField(u"  ",max_length=32)
        def __unicode__(self):
            return self.name
        class Meta:
            verbose_name_plural = u'    '
    
            permissions = (                                        #         
                ('views_customer_list','      '),
                ('views_customer_info','        '),
                ('edit_views_culstomer_info','      '),
            )

    models가 수정되었습니다.py 파일 후 데이터베이스에 동기화해야 합니다.
    sudo python manage.py makemigrations
    
    sudo python manage.py migrate

    3. 권한 일치 방법 정의
    appname/permission.py
    #!_*_ coding:utf-8 _*_

    from django.core.urlresolvers import resolve
    from django.shortcuts import render,redirect


    perm_dic ={
    'views_customer_list':['customer_list','GET',[]], # , url, , , , views_customer_list
    'views_customer_info':['customer_info','GET',[]],
    'edit_views_customer_info':['customer_info','POST',['test']] # ['test']
    }




    # , *args,**kwargs
    def perm_check(*args,**kwargs):
    request = args[0]
    # , url url ,request.path_info url
    url_resovle_obj = resolve(request.path_info)
    # url
    current_url_namespace = url_resovle_obj.url_name
    # , ( ) , ,
    matched_flag = False
    matched_perm_key = None
    # url (url )
    if current_url_namespace is not None:
    # , key ,
    for perm_key in perm_dic:
    #
    perm_val = perm_dic[perm_key]
    # 3
    if len(perm_val) == 3:
    url_namespace,request_method,request_args = perm_val
    # url
    if url_namespace == current_url_namespace:
    #
    if request.method == request_method:
    # (perm_dic) [] ,
    if not request_args:
    #
    matched_flag = True
    # ( key) matched_perm_key
    matched_perm_key = perm_key
    # ,
    break
    else: # ,( )
    #
    for request_arg in request_args:
    # , get post
    request_method_func = getattr(request,request_method)
    #
    if request_method_func.get(request_arg) is not None:
    matched_flag = True #
    else:
    matched_flag = False
    break
    #
    if matched_flag == True:
    matched_perm_key = perm_key
    break
    else:
    # ,
    return True
    #
    if matched_flag == True:
    #stu_crm.views_customer_list
    perm_str = "stu_crm.%s" %(matched_perm_key)
    #.has_perm() django , appname+auth_permission codename , , True
    if request.user.has_perm(perm_str):
    return True
    else:
    return False
    else:
    print("\033[41;1m ----- no matched permission ----\033[0m")


    def check_permission(func):
    def wrapper(*args,**kwargs):
    #
    if not perm_check(*args,**kwargs):
    #args[0] request
    return render(args[0],'stu_crm/403.html')
    return func(*args,**kwargs)
    return wrapper
     

    4、customer를 수정합니다.html, 고정된 URL을 별명으로 대체
    <td><a href="{% url 'customer_info' customer.id %}">{{ customer.id }}a>td>

    5, URL 전송 규칙 수정, 별명 추가
    appname/urls.py
    urlpatterns = [
        url(r'^$',views.dashboard),
        url(r'^customer/$',views.customer,name='customer_list'),
        url(r'^customer/(\d+)/$',views.customer_info,name='customer_info'),    #    url  
    ]

    6, 403 페이지 정의.
    templates/403.html
     
    설정이 끝난 후 슈퍼유저를 사용하여admin 백엔드에 로그인하여user에서 모든 일반 사용자에게 권한을 설정합니다.테이블'authuser_user_permissions'에 하나 기록될 거예요.
    주: 우선 슈퍼 사용자를 사용하여 일반 사용자의'Staff status'옵션을 선택하여 로그인을 허용해야 합니다.
    전재 대상:https://www.cnblogs.com/ahaii/p/5755718.html

    좋은 웹페이지 즐겨찾기