Django의 권한 시스템
권한 시스템의 기본 논리 프로세스:
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.