Django-guardian: user.has_perm("perm", obj)이 예기치 μ•Šκ²Œ μž‘λ™ν•©λ‹ˆλ‹€.

에 λ§Œλ“  2011λ…„ 09μ›” 03일  Β·  28μ½”λ©˜νŠΈ  Β·  좜처: django-guardian/django-guardian

ν‘œμ€€ user.has_perm("perm") λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 경우 μ‚¬μš©μžμ—κ²Œ μ „μ—­ κΆŒν•œ "perm" 이 μžˆλŠ” κ²½μš°μ—λ§Œ True λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
그리고 user.has_perm("perm", obj) κ°€ μ‚¬μš©λ˜λ©΄ μ‚¬μš©μžκ°€ 이 νŠΉμ • κ°œμ²΄μ— μ•‘μ„ΈμŠ€ν•  수 μžˆλŠ” κΆŒν•œμ΄ 있으면 True λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
κ·ΈλŸ¬λ‚˜ μ‚¬μš©μžμ—κ²Œ μ „μ—­ κΆŒν•œ "perm" 이 μžˆλ”λΌλ„ False λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. μ΄λŠ” 제 생각에 μ „μ—­ κΆŒν•œμ΄ μžˆμ–΄μ•Ό μ‚¬μš©μžμ—κ²Œ λͺ¨λ“  κ°œμ²΄μ— λŒ€ν•œ μ•‘μ„ΈμŠ€ κΆŒν•œμ„ λΆ€μ—¬ν•΄μ•Ό ν•œλ‹€κ³  κ°€μ •ν•˜κΈ° λ•Œλ¬Έμ— μ˜ˆμƒμΉ˜ λͺ»ν•œ μΌμž…λ‹ˆλ‹€. λ‚΄ 말이 λ§žμ•„?

Enhancement

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

_AUTHENTICATION_BACKENDS_ 섀정을 뢙여넣을 수 μžˆμŠ΅λ‹ˆκΉŒ?

이미 Django λ¬Έμ„œλ₯Ό μ½μ—ˆμœΌλ―€λ‘œ μ§€μ •λœ λ°±μ—”λ“œμ˜ μˆœμ„œκ°€ μ€‘μš”ν•˜λ‹€λŠ” 것을 μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€.

κ·€ν•˜μ˜ μ‘μš© ν”„λ‘œκ·Έλž¨μ— λ‹€μŒκ³Ό 같은 것이 μžˆλ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€.

AUTHENTICATION_BACKENDS = (
    'guardian.backends.ObjectPermissionBackend',
    'django.contrib.auth.backends.ModelBackend',
)

μ•„λ‹ˆλ©΄ 이거:

from django.conf import global_settings
AUTHENTICATION_BACKENDS = (
    'guardian.backends.ObjectPermissionBackend',
) + global_settings.AUTHENTICATION_BACKENDS

κΈ°λ³Έ λ°±μ—”λ“œκ°€ λ¨Όμ € μ§€μ •λ˜μ—ˆλŠ”μ§€ ν™•μΈν•˜μ‹­μ‹œμ˜€.

이것이 λ¬Έμ œμΈμ§€ 확인할 수 μžˆμŠ΅λ‹ˆκΉŒ? 그렇지 μ•Šμ€ 경우 정보λ₯Ό 더 μΆ”κ°€ν•˜μ‹­μ‹œμ˜€(λ‹€λ₯Έ λ°±μ—”λ“œλ„ μ‚¬μš©ν•˜κ±°λ‚˜ _User.has_perm_ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” λ‹€λ₯Έ μ•± μ›μˆ­μ΄ 패치?).

λͺ¨λ“  28 λŒ“κΈ€

쑰금 더 νŒŒκ³ λ“€μ–΄λ³΄λ‹ˆ 각 κΆŒν•œ λ°±μ—”λ“œκ°€ λ…λ¦½μ μœΌλ‘œ μž‘λ™ν•΄μ•Ό ν•˜λ―€λ‘œ μœ„μ—μ„œ μ„€λͺ…ν•œ 것과 같은 상황이 λ°œμƒν•΄μ„œλŠ” μ•ˆ λ©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ–΄λ–€ 이유둜 개체 μΈμŠ€ν„΄μŠ€λ₯Ό μ œκ³΅ν•˜λŠ” user.has_perm λ₯Ό ν˜ΈμΆœν•˜λ©΄ 개체 μˆ˜μ€€ κΆŒν•œλ§Œ ν™•μΈν•˜κ³  μ „μ—­ κΆŒν•œ 확인은 κ±΄λ„ˆλœλ‹ˆλ‹€. κ·Έ ν–‰λ™μ˜ μ΄μœ κ°€ 무엇인지 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. μ €λŠ” Django 1.2.5λ₯Ό μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

_AUTHENTICATION_BACKENDS_ 섀정을 뢙여넣을 수 μžˆμŠ΅λ‹ˆκΉŒ?

이미 Django λ¬Έμ„œλ₯Ό μ½μ—ˆμœΌλ―€λ‘œ μ§€μ •λœ λ°±μ—”λ“œμ˜ μˆœμ„œκ°€ μ€‘μš”ν•˜λ‹€λŠ” 것을 μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€.

κ·€ν•˜μ˜ μ‘μš© ν”„λ‘œκ·Έλž¨μ— λ‹€μŒκ³Ό 같은 것이 μžˆλ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€.

AUTHENTICATION_BACKENDS = (
    'guardian.backends.ObjectPermissionBackend',
    'django.contrib.auth.backends.ModelBackend',
)

μ•„λ‹ˆλ©΄ 이거:

from django.conf import global_settings
AUTHENTICATION_BACKENDS = (
    'guardian.backends.ObjectPermissionBackend',
) + global_settings.AUTHENTICATION_BACKENDS

κΈ°λ³Έ λ°±μ—”λ“œκ°€ λ¨Όμ € μ§€μ •λ˜μ—ˆλŠ”μ§€ ν™•μΈν•˜μ‹­μ‹œμ˜€.

이것이 λ¬Έμ œμΈμ§€ 확인할 수 μžˆμŠ΅λ‹ˆκΉŒ? 그렇지 μ•Šμ€ 경우 정보λ₯Ό 더 μΆ”κ°€ν•˜μ‹­μ‹œμ˜€(λ‹€λ₯Έ λ°±μ—”λ“œλ„ μ‚¬μš©ν•˜κ±°λ‚˜ _User.has_perm_ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” λ‹€λ₯Έ μ•± μ›μˆ­μ΄ 패치?).

μ•Œκ² μŠ΅λ‹ˆλ‹€. λ„ˆλ¬΄ ν”Όκ³€ν•œ 것 κ°™μŠ΅λ‹ˆλ‹€. 주문은 _has_perm_ 결과에 영ν–₯을 λ―ΈμΉ˜μ§€ μ•Šμ•„μ•Ό ν•©λ‹ˆλ‹€. λ”°λΌμ„œ μ‚¬μš© 쀑인 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 섀정에 λŒ€ν•œ μΆ”κ°€ 정보λ₯Ό μΆ”κ°€ν•˜μ‹­μ‹œμ˜€. λ˜ν•œ ν…ŒμŠ€νŠΈ μŠ€μœ„νŠΈ(_python manage.py test Guardian_)λ₯Ό μ‹€ν–‰ν•˜μ—¬ 가디언이 μ œλŒ€λ‘œ μž‘λ™ν•˜λŠ”μ§€ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

였, μ•Œκ² μŠ΅λ‹ˆλ‹€. κ·€ν•˜μ˜ 문제λ₯Ό ν•œ 번 더 μ½μ—ˆμŠ΅λ‹ˆλ‹€. κΈ°λ³Έ _auth.ModelBackend_λŠ” _supports_object_permissions_λ₯Ό μ§€μ›ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€ (ν•΄λ‹Ή 속성은 _False_μž„). Django λ¬Έμ„œμ— λ”°λ₯΄λ©΄ 1.4λΆ€ν„° κΈ°λ³Έ λ°±μ—”λ“œμ— λŒ€ν•œ 지원을 μΆ”κ°€ν•©λ‹ˆλ‹€.

λ”°λΌμ„œ κ·€ν•˜μ˜ 상황에 따라 행동은 μ ˆλŒ€μ μœΌλ‘œ μ •ν™•ν•˜κ³  μ˜ˆμƒλ©λ‹ˆλ‹€. κΈ°λ³Έ λ°±μ—”λ“œλŠ” λ‹¨μˆœνžˆ μƒλž΅λ©λ‹ˆλ‹€.

μ•±μ—μ„œ 개체 μˆ˜μ€€ κΆŒν•œμ„ ν™•μΈν•˜κΈ° 전에 μ „μ—­ κΆŒν•œμ„ 확인해야 ν•©λ‹ˆλ‹€. λ‚΄κ°€ 생각할 μˆ˜μžˆλŠ” κ°€μž₯ κ°„λ‹¨ν•œ μ†”λ£¨μ…˜μž…λ‹ˆλ‹€.

_invalid_(으)둜 μ’…λ£Œλ˜μ§€λ§Œ μƒˆ λŒ“κΈ€λ‘œ λ‹€μ‹œ μ—΄λ €λ©΄ 자유둭게 ν•˜μ‹­μ‹œμ˜€!

λ„€ 말이 λ§žλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ „μ—­ κΆŒν•œμ„ ν™•μΈν•˜μ§€ μ•ŠμœΌλ©΄ λ‚˜μ—κ²Œ λͺ‡ 가지 μ‹¬κ°ν•œ λ¬Έμ œκ°€ λ°œμƒν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ guardian.decorators.permission_required μ—μ„œ κ°€μ •ν•œ λŒ€λ‘œ μΆ”κ°€ 개체 μˆ˜μ€€ κΆŒν•œ 검사λ₯Ό 톡해 일반 django.contrib.auth.decorators.permission_required 의 κΈ°λŠ₯을 ν™•μž₯ν•΄μ•Ό ν•©λ‹ˆλ‹€.
λ¬Έμ œλŠ” μ „μ—­ κΆŒν•œμ„ μ‚¬μš©ν•˜λŠ” μž‘μ—… μ‘μš© ν”„λ‘œκ·Έλž¨μ΄ 있고 μΆ”κ°€ 개체 μˆ˜μ€€ κΆŒν•œμ„ μΆ”κ°€ν•˜κ³  μ‹Άμ—ˆκΈ° λ•Œλ¬Έμ— κΈ°λ³Έ permission_required λ°μ½”λ ˆμ΄ν„°λ₯Ό django-guardian의 개체 μˆ˜μ€€ λ°μ½”λ ˆμ΄ν„°λ‘œ λ³€κ²½ν–ˆμ§€λ§Œ 그런 λ‹€μŒ μ‚¬μš©μžλŠ” μ „μ—­ κΆŒν•œμ„ 기반으둜 μ•‘μ„ΈμŠ€ κΆŒν•œμ„ μžƒμ—ˆμŠ΅λ‹ˆλ‹€.

λ‚˜μ—κ²Œ 예기치 μ•Šμ€ λ™μž‘μ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€. μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄μ§€ μ•Šκ³ λŠ” λͺ…ν™•ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μ΅œμ†Œν•œ 이 경우λ₯Ό λ¬Έμ„œμ— μΆ”κ°€ν•΄ μ£Όμ‹œκ² μŠ΅λ‹ˆκΉŒ?

μ €μ—κ²Œ 이것은 섀계 κ²°ν•¨μœΌλ‘œ 인해 μ „μ—­ 및 κ°œμ²΄λ³„ κΆŒν•œμ„ λͺ¨λ‘ 확인해야 ν•˜λŠ” μ½”λ“œ 전체에 λŒ€ν•΄ μΆ”κ°€ 검사가 ν•„μš”ν•©λ‹ˆλ‹€.

@coagulant : μ‹€μ œλ‘œ Django의 μΈμ¦μ—μ„œ λ°μ½”λ ˆμ΄ν„°λ₯Ό _ν™•μž₯_ν•˜λŠ” 것은 μœ μ—°ν•˜μ§€ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€. 이 앱은 μ›λž˜ κΆŒν•œμ„ ν™•μž₯ν•˜μ§€ μ•Šκ³  _객체 κΆŒν•œ_을 κ΅¬ν˜„ν•˜λ €κ³  ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ 보호자 및 개체 μˆ˜μ€€ κΆŒν•œλ§Œ μ‚¬μš©ν•˜λŠ” λ‹€λ₯Έ 앱을 μ‚¬μš©ν•˜λ €λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Ό ν•©λ‹ˆκΉŒ? adminμ—μ„œλ§Œ μ „μ—­ κΆŒν•œμ„ μ‚¬μš©ν•˜κ³  일반 μ‚¬μš©μžμ—κ²Œ λΆ€μ—¬λœ μ•±μ—μ„œλŠ” 개체 μˆ˜μ€€ κΆŒν•œμ„ μ‚¬μš©ν•˜λ €λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Ό ν•©λ‹ˆκΉŒ? 앱이 μ‚¬μš©μžκ°€ κ°œμ²΄μ— λŒ€ν•΄ 일뢀 μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆλ„λ‘ μ „μ—­ κΆŒν•œ κ³Ό 개체 μˆ˜μ€€ κΆŒν•œμ„ λͺ¨λ‘ μš”κ΅¬ν•œλ‹€λ©΄ μ–΄λ–»κ²Œ λ κΉŒμš”? λ§Žμ€ κ²½μš°κ°€ 있으며 λ³΄ν˜Έμžκ°€ λͺ¨λ“  경우λ₯Ό λ‹€λ£¨μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€.

λ°˜λ©΄μ— 이 νŠΉμ • μ‚¬μš© 사둀가 λ‹€λ₯Έ 사둀보닀 더 일반적일 수 μžˆμŒμ„ 인정할 수 μžˆμŠ΅λ‹ˆλ‹€. 이에 관심이 μžˆλŠ” μ‚¬λžŒμ€ μš”κ΅¬ 사항을 μ§€μ •ν•˜λŠ” λ‹€λ₯Έ 문제λ₯Ό μ œμΆœν•˜μ‹­μ‹œμ˜€. λ‚˜λŠ” 이것이 λ°±μ›Œλ“œ λΉ„ν˜Έν™˜μ„± 없이, 즉 μƒˆλ‘œμš΄ ꡬ성 μ„€μ •μœΌλ‘œ μ‰½κ²Œ 달성될 수 μžˆλ‹€κ³  λ―ΏμŠ΅λ‹ˆλ‹€.

객체 μˆ˜μ€€ κΆŒν•œκ³Ό μ „μ—­ κΆŒν•œμ„ λͺ¨λ‘ ν™•μΈν•˜λŠ” 또 λ‹€λ₯Έ permission_required λ°μ½”λ ˆμ΄ν„°κ°€ μΆ”κ°€λ˜λ©΄ λ‚˜μ—κ²Œ μœ μš©ν•  κ²ƒμž…λ‹ˆλ‹€. 그것은 λ‚΄ 문제λ₯Ό λ‹€λ£° κ²ƒμž…λ‹ˆλ‹€.

@Dzejkob , λ§ˆμ§€λ§‰ 컀밋을 ν™•μΈν•˜κ³  이것이 μΆ©λΆ„ν•œμ§€ 말해 μ£Όμ‹œκ² μŠ΅λ‹ˆκΉŒ(μ „μ—­ κΆŒν•œ μˆ˜λ½μ„ μœ„ν•œ ν”Œλž˜κ·Έλ₯Ό μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€). λ˜ν•œ λ°μ½”λ ˆμ΄ν„° μžμ²΄μ—μ„œ λ…μŠ€νŠΈλ§μ„ ν™•μž₯ν•˜λŠ” κ²ƒμœΌλ‘œ μΆ©λΆ„ν•œμ§€ μ•Œλ €μ£Όμ‹­μ‹œμ˜€. μ•„λ‹ˆλ©΄ 더 λ§Žμ€ 예제/μ„€λͺ…적인 λ¬Έμ„œλ₯Ό μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆκΉŒ?

μ°Έκ³ : 컀밋은 μƒˆ λΆ„κΈ°: _feature/add-accept_global_perms-flag-for-decorators_에 μžˆμŠ΅λ‹ˆλ‹€.

@lukaszb 예, λ‚΄ ν”„λ‘œμ νŠΈμ— Guardian의 μƒˆ λΆ„κΈ° 버전을 μ„€μΉ˜ν•˜κ³  permission_required decorators accept_global_perms=True 에 λ§€κ°œλ³€μˆ˜λ₯Ό μΆ”κ°€ν–ˆμœΌλ©° μ •μƒμ μœΌλ‘œ μž‘λ™ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. 이 κΈ°λŠ₯을 λ§Œλ“€μ–΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. νŠΈλ ν¬μ— 넣어두면 쒋을 것 κ°™μ•„μš”.
λ¬Έμ„œμ— κ΄€ν•΄μ„œλŠ” λ‚˜μ—κ²Œ 맀우 λͺ…ν™•ν•˜λ―€λ‘œ μΆ©λΆ„ν•˜λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

이것은 였래 전에 μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

μ•ˆλ…•ν•˜μ„Έμš”, μ €λŠ” jango-guardian을 μ‹œλ„ν•˜λ©΄μ„œ 이 문제λ₯Ό λ°œκ²¬ν–ˆκ³  이 λ™μž‘μ΄ 버그가 μžˆκ±°λ‚˜ 맀우 ν˜Όλž€μŠ€λŸ½λ‹€λŠ” 것을 λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€.

μ‚¬μš©μžμ—κ²Œ μ „μ—­ κΆŒν•œμ„ μΆ”κ°€( view_user )ν•œ λ‹€μŒ( joe ) Joeκ°€ νŠΉμ • μ‚¬μš©μžλ₯Ό λ³Ό 수 μžˆλŠ”μ§€ ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€( other_user ) λ†€λžκ²Œλ„ False λ₯Ό λ°˜ν™˜ν–ˆμŠ΅λ‹ˆλ‹€.

joe = User.objects.get(username="joe")
other_user = User.objects.get(username="other_user")
assign_perm("myapp.view_user", joe)
joe.has_perm("myapp.view_user") # True as expected
joe.has_perm("myapp.view_user", other_user) # False, whaaaat?

이제 $#$ settings.py $#$의 REST_FRAMEWORK/DEFAULT_PERMISSION_CLASSES 및 AUTHENTICATION_BACKENDS λ•Œλ¬Έμ— λ·° μ„ΈνŠΈκ°€ "μžλ™μœΌλ‘œ" κΆŒν•œμ„ ν™•μΈν•˜λ―€λ‘œ permission_required λ°μ½”λ ˆμ΄ν„°λ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ‚¬μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. . 그러면 λ³΄ν˜Έμžμ—κ²Œ μ˜ˆμƒλŒ€λ‘œ ν–‰λ™ν•˜λ„λ‘ μ–΄λ–»κ²Œ λ§ν•©λ‹ˆκΉŒ?

(정말 어리석은 것을 λ†“μΉ˜λ©΄ μ‚¬κ³Όλ“œλ¦½λ‹ˆλ‹€. 이것은 djangolandμ—μ„œ μΌμ’…μ˜ 2/3μΌμž…λ‹ˆλ‹€)

였늘 μ†Œλž€μ„ 일으켜 μ£„μ†‘ν•©λ‹ˆλ‹€ guardian.shortcuts.get_objects_for_user() κ°€ 기본적으둜 인증/μ „μ—­ κΆŒν•œμ„ μ‘΄μ€‘ν•œλ‹€λŠ” 점이 훨씬 더 ν₯λ―Έλ‘­κ³ /ν˜Όλž€μŠ€λŸ½μŠ΅λ‹ˆλ‹€( accept_global_perms ).

accept_global_perms: if True takes global permissions into account. 
[...]
Default is True.

비둝 이 λ¬Έμ œκ°€ λ‹€λ₯Έ 문제둜 인해 μ’…λ£Œλ˜μ—ˆμ§€λ§Œ μ—¬κΈ°μ—λŠ” λ§Žμ€ 톡찰λ ₯이 μžˆμœΌλ―€λ‘œ λŒ€ν™”λ₯Ό λ‹€μ‹œ μΌμœΌν‚€κΈ° μœ„ν•΄ 여기에 μ”λ‹ˆλ‹€. Python의 Zen은 λ‹€μŒκ³Ό 같이 λ§ν•©λ‹ˆλ‹€.

이λ₯Ό μˆ˜ν–‰ν•˜λŠ” ν™•μ‹€ν•œ 방법이 ν•˜λ‚˜ μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

그리고 λ‚˜μ—κ²Œ 그것은 _둜컬(객체 μˆ˜μ€€)이 μ§€μ •λ˜μ§€ μ•Šμ•˜μ„ λ•Œ μ „μ—­μœΌλ‘œ λŒ€μ²΄ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€_. μˆœμ„œλŠ” κ²°κ³Όλ₯Ό λ³€κ²½ν•˜μ§€ μ•Šμ§€λ§Œ(Django returns False if obj is not None 이후) μ„±λŠ₯을 λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ½”λ“œ 전체에 λŒ€ν•΄ 이쀑 확인을 ν•˜λŠ” 것은 쒋은 λ””μžμΈμ΄ μ•„λ‹ˆλ©° μ–΄λ–€ μ˜λ―Έμ—μ„œλŠ” DRY 원칙에도 μ–΄κΈ‹λ‚œλ‹€λŠ” 데 λ™μ˜ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ Django κΈ°λ³Έ λ°±μ—”λ“œ λ‚΄μ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” κΈ°λŠ₯을 κ΅¬ν˜„ν•˜λŠ” λ³΄ν˜Έμžλ„ DRYκ°€ μ•„λ‹™λ‹ˆλ‹€. DjangoλŠ” μ—¬λŸ¬ λ°±μ—”λ“œλ₯Ό ν—ˆμš©ν•˜κ³  μˆœμ„œλŒ€λ‘œ ν•˜λ‚˜μ”© ν™•μΈν•˜λ©΄ λ°±μ—”λ“œκ°€ μ„œλ‘œλ₯Ό λŒ€μ²΄ν•˜μ§€ μ•Šκ³  ν•¨κ»˜ μž¬μƒλ˜μ–΄μ•Ό 함을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€. 이것이 λ§žλ‹€λ©΄ DjangoλŠ” obj is not None κ°€ _wrong_일 λ•Œ μ „μ—­ 검사λ₯Ό κ±°λΆ€ν•©λ‹ˆλ‹€. Djangoκ°€ obj λ₯Ό λ¬΄μ‹œν–ˆλ‹€λ©΄ 객체 검사기에 λŒ€ν•œ μ „μ—­ λŒ€μ²΄κ°€ 될 수 μžˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” μš°λ¦¬κ°€ Django둜 티켓을 μ—΄μ–΄ 인증 λ°±μ—”λ“œκ°€ μ„œλ‘œ μ–΄λ–»κ²Œ μž‘λ™ν•˜λŠ”μ§€ 묻고 κ±°κΈ°μ—μ„œ κ°€μ•Ό ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

즉, Djangoκ°€ λ™μž‘μ„ λ³€κ²½ν•˜λŠ” 것은 거의 λΆˆκ°€λŠ₯ν•˜λ‹€κ³  μƒκ°ν•˜λ―€λ‘œ(μ—¬μ „νžˆ 물어봐야 ν•œλ‹€κ³  μƒκ°ν•˜μ§€λ§Œ) ν˜„μƒ μœ μ§€λŠ” 가디언이 μ›ν•˜λŠ” 것에 따라 두 가지λ₯Ό λͺ¨λ‘ μ œκ³΅ν•  수 μžˆλ„λ‘ 진화해야 함을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€. μ„€μ •μ΄λ‚˜ ν•¨μˆ˜μ— λŒ€ν•œ 인수λ₯Ό 톡해 섀정될 수 있음). κ·ΈλŸ¬λ‚˜ κΈ°λ³Έ λ™μž‘μ€ λ³΄λ“œ μ „μ²΄μ—μ„œ false_일 λ•Œ _local fallback to global이어야 ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

Djangoκ°€ True, False 및 None의 3가지 μƒνƒœ κΆŒν•œ μ‹œμŠ€ν…œμ„ μ„ ν˜Έν•œλ‹€λ©΄ 더 μ’‹μ•„ν•  κ²ƒμž…λ‹ˆλ‹€. 이 경우 둜컬 κ²€μ‚¬κΈ°λŠ” False λ₯Ό 톡해 전역을 _μž¬μ •μ˜_ν•  수 μžˆμŠ΅λ‹ˆλ‹€. None λ₯Ό 톡해 각 λ°±μ—”λ“œλŠ” "λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. λ‹€μŒ 쀄에 λ¬Όμ–΄λ³΄μ„Έμš”"라고 말할 수 μžˆμŠ΅λ‹ˆλ‹€. 이 경우 DjangoλŠ” λ°±μ—”λ“œ 쀑 ν•˜λ‚˜μ—μ„œ True or False λ₯Ό 얻은 ν›„ 확인을 μ€‘μ§€ν•˜κ³  처리 λŠ₯λ ₯ λ‚­λΉ„λ₯Ό μ€‘μ§€ν•©λ‹ˆλ‹€.

μ΄λ ‡κ²Œ ν•˜λ©΄ 각 λ°±μ—”λ“œμ— 더 λ§Žμ€ κΆŒν•œμ΄ λΆ€μ—¬λ©λ‹ˆλ‹€. μ΅œμ’… 닡변을 μ œκ³΅ν•˜κ±°λ‚˜ λ‹€λ₯Έ μ‚¬λžŒμ„ μ°Έμ‘°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

@doganmeh DjangoλŠ” tri-state κΆŒν•œ μ‹œμŠ€ν…œμ„ κ΅¬ν˜„ν•©λ‹ˆλ‹€(μ΅œμ†Œ 1.10 이상). μ˜΅μ…˜μ€ True, None 및 PermissionDenied μ˜¬λ¦¬κΈ°μž…λ‹ˆλ‹€. λ‚˜μ€‘μ— μˆ˜ν–‰ν•˜λ©΄ Djangoκ°€ 검사λ₯Ό μ€‘μ§€ν•˜κ³  Falseλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

λ‹Ήλ©΄ν•œ λ¬Έμ œλŠ” Contrib.Auth 문제라고 μƒκ°ν•©λ‹ˆλ‹€. 그것이 'μ „μ—­ κΆŒν•œ'을 λ‹€λ£¨λŠ” λ°±μ—”λ“œμž…λ‹ˆλ‹€. λ¬Έμ œλŠ” obj=None이 μžˆλŠ” has_perm이 'ν…Œμ΄λΈ” κΆŒν•œ'만 ν™•μΈν•˜κ³  objκ°€ μžˆλŠ” has_perm이 'ν–‰ κΆŒν•œ'만 ν™•μΈν•˜λŠ” κ°„μ ‘ κ·œμΉ™μ„ μ„€μ •ν–ˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 그듀은 그것을 λ³€κ²½ν•  것 같지 μ•Šμ§€λ§Œ _should_λŠ” λ‘˜ λ‹€ 확인을 μ§€μ›ν•˜λ„λ‘ APIλ₯Ό ν™•μž₯ν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

(적어도 λ‚˜λŠ” 그듀이 두 가지 λͺ¨λ‘λ₯Ό ν™•μΈν•˜κΈ° μœ„ν•΄ 행동을 μΆ”κ°€ν•  수 있기λ₯Ό λ°”λžλ‹ˆλ‹€. κ·Έλ“€μ˜ μ‹œμŠ€ν…œμ— λͺ…λ°±ν•œ 결함이 μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.)

'λ‘˜ λ‹€ 확인' API에 λŒ€ν•œ μ œμ•ˆμ€ λ¬΄μ—‡μž…λ‹ˆκΉŒ? λ‚΄κ°€ 생각할 μˆ˜μžˆλŠ” μ΅œμ„ μ€ kwargμž…λ‹ˆλ‹€.

λ‚˜λŠ” Permission ν…Œμ΄λΈ”μ— NullBooleanFieldκ°€ μžˆλŠ” λͺ…μ‹œμ μœΌλ‘œ tristate μ‹œμŠ€ν…œμ— λŒ€ν•΄ μ΄μ•ΌκΈ°ν•˜κ³  μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 사싀, True λΆ€μ‘±(λ˜λŠ” κΆŒν•œ λΆ€μ‘±)을 None 둜 κ°„μ£Όν•˜λ©΄ μ‚Όκ΅­μœΌλ‘œ 간주될 수 μžˆμŠ΅λ‹ˆλ‹€. 이 경우 λ³΄ν˜Έμžκ°€ μ§€μ •ν•˜μ§€ μ•Šμ€ κΆŒν•œμ€ None 둜 κ°„μ£Όν•˜μ—¬ 결정을 전역에 μœ„μž„ν•΄μ•Ό ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ„ νƒμ˜ 여지가 μžˆλ‹€λ©΄ λͺ…μ‹œμ μΈ λ””μžμΈμ„ μ„ νƒν•˜κ² μŠ΅λ‹ˆλ‹€.

@airstandley λ‹€μŒκ³Ό 같이 user.has_perm 에 kwargλ₯Ό μΆ”κ°€ν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

def has_perm(self, perm, obj=None, fallback=False)

도움이 될 것 κ°™μ•„μš”. fallback=True 인 경우 λ³΄ν˜ΈμžλŠ” Django λ°±μ—”λ“œλ₯Ό ν˜ΈμΆœν•˜κ³  전역을 λ°˜ν™˜ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ„ νƒμ˜ 여지가 μžˆλ‹€λ©΄ λ‚΄λΆ€λ₯Ό κ°€λ‘œμ±„μ§€ μ•Šκ³  ν”„λ ˆμž„μ›Œν¬μ—μ„œ μžμ—°μŠ€λŸ½κ²Œ μ²˜λ¦¬λ˜λŠ” Django둜의 폴백을 μ„ ν˜Έν•©λ‹ˆλ‹€.

@doganmeh 말 을 잘λͺ»ν•΄μ„œ μ£„μ†‘ν•©λ‹ˆλ‹€. "True, False 및 PermissionDenied λ°œμƒ"을 읽어야 ν•©λ‹ˆλ‹€. μ•„λ‹ˆλ‹€:

μ˜΅μ…˜μ€ True, None 및 PermissionDenied μ˜¬λ¦¬κΈ°μž…λ‹ˆλ‹€.

ν›„μžλŠ” λ‚΄ λ¨Έλ¦¬μ—μ„œ λ°˜ν™˜μ„ μƒκ°ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€ ...

λ‚˜λ„ 당신이 μ˜λ―Έν•˜λŠ” λ°”λ₯Ό 잘λͺ» μ΄ν•΄ν–ˆμ„ 수 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€

Djangoκ°€ tri-state κΆŒν•œ μ‹œμŠ€ν…œμ„ μ„ ν˜Έν•œλ‹€λ©΄ 더 μ’‹μ•„ν•  κ²ƒμž…λ‹ˆλ‹€.

λͺ…ν™•νžˆ ν•˜μžλ©΄, μ‹œμŠ€ν…œ 전체가 μ•„λ‹ˆλΌ ꡬ체적으둜 κΆŒν•œ λͺ¨λΈ κ΅¬ν˜„μ— λŒ€ν•΄ λ§μ”€ν•˜μ‹  κ²ƒμž…λ‹ˆκΉŒ?

λ‚΄ μš”μ μ€ 인증 λ°±μ—”λ“œ μ‹œμŠ€ν…œμ΄ κ·€ν•˜κ°€ μ„€λͺ…ν•œ μ •ν™•ν•œ λ°”λ‘œ κ°€κΈ°λ₯Ό ν—ˆμš©ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€(적어도 has_perm , has_module_perms api의 경우). κ°„λ‹¨ν•˜μ§€ μ•Šλ”λΌλ„ λͺ…μ‹œμ μž…λ‹ˆλ‹€.
λͺ¨λ“  λ°±μ—”λ“œλŠ” 자체적으둜 결정을 λ‚΄λ¦¬κ±°λ‚˜(True λ˜λŠ” PermissionDenied λ°˜ν™˜) 결정을 체인의 λ‹€μŒ 백업에 μœ„μž„ν•  수 μžˆμŠ΅λ‹ˆλ‹€(False λ°˜ν™˜). μ΄λŠ” μ‹œμŠ€ν…œ 자체의 ν’ˆμ§ˆμ΄ μ•„λ‹ˆλΌ κ΅¬ν˜„μ— λ”°λ₯Έ κ²°μ •μž…λ‹ˆλ‹€.

λͺ…μ‹œμ  ObjectPermissionBackendλŠ” λ‚΄ ν”„λ‘œμ νŠΈμ— λ¬Έμ œκ°€ 될 수 μžˆμœΌλ―€λ‘œ λͺ…μ‹œμ μœΌλ‘œ μ„ νƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ("λͺ…μ‹œμ„±"은 λ‹€λ₯Έ κΆŒν•œ 검사 λ°±μ—”λ“œμ™€μ˜ 톡합을 μ–΄λ ΅κ²Œ λ§Œλ“­λ‹ˆλ‹€.) κ·€ν•˜μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ λ‹€λ₯Έ μ‚¬λžŒλ“€λ„ λͺ…μ‹œμ  방식을 μ„ ν˜Έν•  것이라고 μƒκ°ν•©λ‹ˆλ‹€. λ”°λΌμ„œ μ„€μ •μœΌλ‘œ 'λͺ…ν™•μ„±'을 κ°–λŠ” 것이 λ‚˜μ—κ²Œ μ˜λ―Έκ°€ μžˆμŠ΅λ‹ˆλ‹€.

@doganmeh
κ·Έλž˜μ„œ kwarg에 λŒ€ν•΄.

λ¨Όμ € 인증 λ°±μ—”λ“œ μ‹œμŠ€ν…œμ˜ λ™μž‘μ΄ μ˜λ„λœ 방식에 λŒ€ν•΄ λ™μΌν•œ νŽ˜μ΄μ§€μ— μžˆμ§€ μ•Šλ‹€λŠ” 점에 λŒ€ν•΄ 계속 κ±±μ •ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ λͺ…ν™•ν•˜κ²Œ :
λ‚΄ μ΄ν•΄λŠ” λ°±μ—”λ“œκ°€ ν•¨κ»˜ μž‘λ™ν•˜λ„λ‘ μ˜λ„ν–ˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 앱이 인증의 κΆŒν•œ μ‹œμŠ€ν…œ(예: 'μ „μ—­ κΆŒν•œ', κΈ°μˆ μ μœΌλ‘œλŠ” 'ν…Œμ΄λΈ” κΆŒν•œ'μ΄μ§€λ§Œ 감자, 감자)을 μ‚¬μš©ν•˜λ €λŠ” 경우 AUTH_BACKENDS에 인증 ModelBackendλ₯Ό μ„€μΉ˜ν•©λ‹ˆλ‹€. ν•΄λ‹Ή 앱이 보호자의 ObjectPermission μ‹œμŠ€ν…œ(즉, 'ν–‰ κΆŒν•œ')을 μ‚¬μš©ν•˜λ €λŠ” 경우 AUTH_BACKENDS에 μžˆλŠ” 보호자의 ObjectPermissionBackendκ°€ μ•„λ‹™λ‹ˆλ‹€.
ModelBackendλŠ” μ „μ—­ κΆŒν•œμ„ μ²˜λ¦¬ν•©λ‹ˆλ‹€.
ObjectPermissionBackendλŠ” 개체 κΆŒν•œμ„ μ²˜λ¦¬ν•©λ‹ˆλ‹€.
μ‚¬μš©μžμ—κ²Œ 개체 κΆŒν•œλ§Œ μžˆλŠ” 경우 ModelBackendλŠ” has_perm 에 λŒ€ν•΄ Trueλ₯Ό λ°˜ν™˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ‚¬μš©μžμ—κ²Œ μ „μ—­ κΆŒν•œλ§Œ μžˆλŠ” 경우 ObjectPermissionBackendλŠ” has_perm 에 λŒ€ν•΄ Trueλ₯Ό λ°˜ν™˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 두 경우 λͺ¨λ‘ user.has_perm(perm, obj)에 λŒ€ν•œ ν˜ΈμΆœμ€ μ—¬μ „νžˆ ​​trueλ₯Ό λ°˜ν™˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ‚¬μš©μžλŠ” μ„€μΉ˜λœ λ°±μ—”λ“œ 쀑 _one_에 λŒ€ν•œ κΆŒν•œμ΄ 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€. (이 κ³„μ •μ—μ„œ ModelBackendκ°€ μ‹€νŒ¨ν•˜μ—¬ λ¬Έμ œκ°€ λ°œμƒν•œ κ²ƒμž…λ‹ˆλ‹€.)

μ’‹μ•„, κ·Έλž˜μ„œ λͺ¨λ“  것이 μ£Όμ–΄μ‘Œλ‹€.

ν˜Έν™˜μ„±μ΄ λ¬Έμ œκ°€ λ˜μ§€ μ•ŠλŠ” 이상적인 μ„Έμƒμ—μ„œλŠ” 저도 contrib.auth의 ModelBackendλ₯Ό κ°„λ‹¨νžˆ λ³€κ²½ν•˜λŠ” 것을 μ„ ν˜Έν•©λ‹ˆλ‹€. ModelBackend.has_perm(user_obj, perm, obj=None) λŠ” μ‚¬μš©μžκ°€ permμ—μ„œ μ§€μ •ν•œ 'μ „μ—­ κΆŒν•œ'을 가지고 있으면 Trueλ₯Ό λ°˜ν™˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. objκ°€ None인지 여뢀에 관계없이.

κ·ΈλŸ¬λ‚˜ ν˜Έν™˜μ„±μ΄ λ¬Έμ œμ΄λ―€λ‘œ λ¬Έμ œμ— λŒ€ν•œ 해결책이 μžˆλŠ”μ§€ λ¬»μŠ΅λ‹ˆλ‹€.

λ‚΄κ°€ 생각할 수 μžˆλŠ” μœ μΌν•œ _backwards compatible_ μ†”λ£¨μ…˜μ€ API에 kwargλ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ AUTH 섀정을 μΆ”κ°€ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

κ·Έλž˜μ„œ μ½°λ₯΄κ·Έ:
obj_shortcut 라고 λΆ€λ₯΄κ² μŠ΅λ‹ˆλ‹€. 그게 μ œκ°€ 생각해낼 수 μžˆλŠ” μ΅œμ„ μ˜ 방법이기 λ•Œλ¬Έμž…λ‹ˆλ‹€. object_shortcut λŠ” 기본적으둜 True둜 μ„€μ •λ©λ‹ˆλ‹€. object_shortcut κ°€ True이면 λ°±μ—”λ“œλŠ” ModelBackendκ°€ μ§€κΈˆ ν•˜λŠ” κ²ƒμ²˜λŸΌ λ™μž‘ν•΄μ•Ό ν•©λ‹ˆλ‹€. objκ°€ None이면 'ν…Œμ΄λΈ”/μ „μ—­' κΆŒν•œμ„ _만_ 확인해야 ν•˜κ³ , 그렇지 μ•ŠμœΌλ©΄ 'ν–‰/개체' κΆŒν•œμ„ _만__ 확인해야 ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ object_shortcut κ°€ False이면 λ°±μ—”λ“œλŠ” λ‘˜ λ‹€ μ„ ν˜Έν•˜λŠ” λŒ€λ‘œ λ™μž‘ν•΄μ•Ό ν•©λ‹ˆλ‹€. 즉, 객체가 None이 아닐 λ•Œ μ „μ—­ 및 객체 κΆŒν•œ _λͺ¨λ‘_λ₯Ό ν™•μΈν•©λ‹ˆλ‹€. 그런 λ‹€μŒ Guardianκ³Ό 같은 μΆ”κ°€ κΈ°λŠ₯은 항상 object_shortcut=False λ₯Ό κΈ°λ³Έκ°’μœΌλ‘œ μ‚¬μš©ν•˜μ—¬ has_perm λ©”μ„œλ“œλ‘œ λ―ΉμŠ€μΈμ„ μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€. perm이 λ‚˜νƒ€λ‚΄λŠ” κΆŒν•œμ΄ μ‚¬μš©μžμ—κ²Œ ν• λ‹Ήλœ 경우 user.has_perm(perm, obj, object_shortcut=False) λŠ” μ˜¬λ°”λ₯΄κ²Œ Trueλ₯Ό λ°˜ν™˜ν•˜μ§€λ§Œ user.has_perm(perm, obj) 에 λŒ€ν•œ λ ˆκ±°μ‹œ ν˜ΈμΆœμ€ 계속 Falseλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

섀정은 λ™μΌν•œ κ²°κ³Όλ₯Ό κ°–μ§€λ§Œ 기본적으둜 ModelBackend._get_permissions 둜 μ „ν™˜λ©λ‹ˆλ‹€.

if not user_obj.is_active or user_obj.is_anonymous or obj is not None:
    return set()

λ‹€μŒκ³Ό 같이 될 κ²ƒμž…λ‹ˆλ‹€.

if not user_obj.is_active or user_obj.is_anonymous or (obj is not None and legacy_behaviour_setting_is _on):
    return set()

μ–΄λŠ 것이 더 λ‚˜μ€μ§€ ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 섀정이 더 κΉ”λ”ν•˜λ‹€κ³  μƒκ°ν•˜μ§€λ§Œ Django κ°œλ°œμžκ°€ 그것을 κ²°μ •ν•  자격이 더 μžˆμ„ 것이라고 ν™•μ‹ ν•©λ‹ˆλ‹€.

μš”μ μ€ 문제λ₯Ό κ³ μΉ  수 μžˆλ‹€λŠ” 것이고, λ‚˜λŠ” κ·Έ λ¬Έμ œκ°€ Guardian이 μ•„λ‹ˆλΌ Django 버그라고 ꡳ게 λ―ΏμŠ΅λ‹ˆλ‹€.

@airstandley λ§žμŠ΅λ‹ˆλ‹€. False λ˜λŠ” None λŠ” μ€‘μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‘˜ λ‹€ λ‚΄κ°€ λͺ¨λ₯Έλ‹€λŠ” λœ»μž…λ‹ˆλ‹€. κ²°κ΅­ 아무도 λͺ¨λ₯΄λ©΄ ν—ˆκ°€κ°€ λ‚˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” 일반적으둜 λ‹Ήμ‹ κ³Ό 같은 νŽ˜μ΄μ§€μ— μžˆμ§€λ§Œ djangoκ°€ λ°±μ—”λ“œκ°€ μ–΄λ–€ μ‹μœΌλ‘œλ“  λ™μž‘ν•˜λ„λ‘ κ°•μ œν•˜λŠ” 것은 λŠμŠ¨ν•œ 결합성을 μ €ν•˜μ‹œν‚€λŠ” κ²ƒμ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€. 각 λ°±μ—”λ“œκ°€ μž‘μ—…μ„ μ™„λ£Œν•˜λŠ” 데 ν•„μš”ν•œ 정보λ₯Ό 얻을 수 μžˆλ„λ‘ ν•˜λŠ” λ©”μ»€λ‹ˆμ¦˜μ΄ μžˆμ–΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. λ‚˜λŠ” ν‚€μ›Œλ“œ μΈμˆ˜μ— λŒ€ν•΄ λ‹Ήμ‹ κ³Ό ν•¨κ»˜ν•˜μ§€λ§Œ μ–΄λ–€ 식 μœΌλ‘œλ“  κ°•μš”ν•˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€.

이 λŒ€ν™”λŠ” μ‹œκ°„ λ‚­λΉ„μ²˜λŸΌ λ³΄μ΄μ§€λ§Œ λ³΄ν˜Έμžμ—κ²Œ ν—ˆλ½μ΄ μ—†λŠ” 것은 κ±°λΆ€κ°€ μ•„λ‹ˆλΌ 정보 뢀쑱일 λΏμž„μ„ 슀슀둜 λͺ…ν™•νžˆ ν•˜λŠ” 데 도움이 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

μ–΄μ¨Œλ“  λ‚˜λŠ” ν’€ λ¦¬ν€˜μŠ€νŠΈ #546을 ν–ˆλ‹€. 그것을 ν™•μΈν•˜κ³  λ‹Ήμ‹ μ˜ 생각을 μ•Œλ €μ£Όμ‹­μ‹œμ˜€.

django: https://code.djangoproject.com/ticket/29012 둜 티켓을 λ§Œλ“€μ—ˆλŠ”λ° 그듀이 뭐라고 할지 κΆκΈˆν•©λ‹ˆλ‹€.

django에 λ‹€λ₯Έ 티켓이 μžˆμ—ˆλ˜ 것 κ°™μŠ΅λ‹ˆλ‹€: https://code.djangoproject.com/ticket/20218

λ‚˜λŠ” λ‚΄ 것을 λ‹«μ•˜λ‹€.

@doganmeh
λ‚˜λŠ” 당신이 #546으둜 ν–₯ν•˜λŠ” λ°©ν–₯을 μ’‹μ•„ν•©λ‹ˆλ‹€. 도움이 λœλ‹€λ©΄ 이번 주말에 λ‚˜λ¨Έμ§€ μœ λ‹›μ„ μ‚΄νŽ΄λ³΄κ³  μ΄λŸ¬ν•œ λŒ€μ²΄μ— λŒ€ν•œ λͺ‡ 가지 ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•΄μ•Ό ν•©λ‹ˆλ‹€.

접선에. νŠΉμ • λ°©μ‹μœΌλ‘œ λ™μž‘ν•˜λ„λ‘ "Django forcing backends"에 λŒ€ν•œ κ·€ν•˜μ˜ μ˜κ²¬μ€ μ €λ₯Ό ν˜Όλž€μŠ€λŸ½κ²Œ ν•˜μ§€λ§Œ λ˜ν•œ μ €μ—κ²Œ 생각을 μ£Όμ—ˆμŠ΅λ‹ˆλ‹€. λ°±μ—”λ“œλŠ” μ›ν•˜λŠ” λŒ€λ‘œ μž‘λ™ν•  수 μžˆμŠ΅λ‹ˆλ‹€. Guardian의 ObjectPermissionBackend에 λŒ€ν•œ λ‚˜μ˜ 초기 μš°λ €λŠ” 이것이 Auth의 ModelBackend와 ν•¨κ»˜ μ‹€ν–‰λ˜λ„λ‘ μ„€κ³„λ˜μ—ˆμŒμ„ μ œμ•ˆν•˜λŠ” λ¬Έμ„œμ—μ„œ λΉ„λ‘―λ©λ‹ˆλ‹€. Guardian은 ModelBackend와 ν•¨κ»˜ μž‘λ™ν•˜λ„λ‘ μ„€κ³„λœ λ°±μ—”λ“œμ™€ λ‹¨λ…μœΌλ‘œ μž‘λ™ν•˜λ„λ‘ μ„€κ³„λœ μ—¬λŸ¬ λ°±μ—”λ“œλ₯Ό μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€. (κ°€λ””μ–Έμ˜ UserObjectPermission/GroupObjectPermission ν…Œμ΄λΈ”λ§Œ ν™•μΈν•˜λŠ” IE, λ‹€λ₯Έ ν•˜λ‚˜λŠ” UserObjectPermission/GroupObjectPermission ν…Œμ΄λΈ”κ³Ό Auth의 κΆŒν•œ ν…Œμ΄λΈ”μ„ λͺ¨λ‘ ν™•μΈν•©λ‹ˆλ‹€.)
개인적으둜 λ‚˜λŠ” μ„€μ •κ³Ό kwargsκ°€ μžˆλŠ” ν˜„μž¬ μ ‘κ·Ό 방식을 μ„ ν˜Έν•©λ‹ˆλ‹€. 닀쀑 λ°±μ—”λ“œ μ ‘κ·Ό λ°©μ‹μ˜ μ£Όμš” 단점은 λ°”λ‘œ κ°€κΈ° 및 편의 κΈ°λŠ₯이 μ–΄λ–»κ²Œ μž‘λ™ν•΄μ•Ό ν•˜λŠ”μ§€κ°€ λΆˆλΆ„λͺ…ν•΄μ§„λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

Django dev 메일링 λ¦¬μŠ€νŠΈμ— λŒ€ν•œ κ²Œμ‹œλ¬Όμ„ λ³΄μ•˜μŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 그듀이 그것을 λ°›μ•„λ“€μ΄κ±°λ‚˜ 양립할 수 μ—†λŠ” λ°©μ‹μœΌλ‘œ 행동을 λ°”κΎΈλŠ” 데 λ™μ˜ν•˜κΈ°λ₯Ό λ°”λžλ‹ˆλ‹€. API에 λŒ€ν•œ ν˜„μž¬ μ œν•œ 사항은 νˆ¬λ°•ν•©λ‹ˆλ‹€.

거기에 지원할 수 μžˆμŠ΅λ‹ˆκΉŒ? 😊

Windows 10용 λ©”μΌμ—μ„œ 보냄

λ³΄λ‚Έμ‚¬λžŒ: μ—μ–΄μŠ€νƒ λ“€λ¦¬
보낸 λ‚ μ§œ: 2018λ…„ 1μ›” 12일 κΈˆμš”μΌ μ˜€ν›„ 12:06
λ°›λŠ” μ‚¬λžŒ: django-guardian/django-guardian
μ°Έμ‘°: Mehmet Dogan; μ–ΈκΈ‰ν•˜λ‹€
제λͺ©: Re: [django-guardian/django-guardian] user.has_perm("perm", obj)이 예기치 μ•Šκ²Œ μž‘λ™ν•©λ‹ˆλ‹€(#49).

Django dev 메일링 λ¦¬μŠ€νŠΈμ— λŒ€ν•œ κ²Œμ‹œλ¬Όμ„ λ³΄μ•˜μŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 그듀이 그것을 λ°›μ•„λ“€μ΄κ±°λ‚˜ 양립할 수 μ—†λŠ” λ°©μ‹μœΌλ‘œ 행동을 λ°”κΎΈλŠ” 데 λ™μ˜ν•˜κΈ°λ₯Ό λ°”λžλ‹ˆλ‹€. API에 λŒ€ν•œ ν˜„μž¬ μ œν•œ 사항은 νˆ¬λ°•ν•©λ‹ˆλ‹€.
β€”
당신이 μ–ΈκΈ‰λ˜μ—ˆκΈ° λ•Œλ¬Έμ— 이것을 λ°›λŠ” κ²ƒμž…λ‹ˆλ‹€.
이 이메일에 직접 λ‹΅μž₯ν•˜κ±°λ‚˜ GitHubμ—μ„œ λ³΄κ±°λ‚˜ μŠ€λ ˆλ“œλ₯Ό μŒμ†Œκ±°ν•˜μ„Έμš”.

μ•½ 일주일 λ™μ•ˆ 이 문제λ₯Ό μ²˜λ¦¬ν•œ ν›„, 각 λ°±μ—”λ“œλŠ” Guardian에 λŒ€ν•œ 개체 κΆŒν•œμ΄λΌλŠ” ν•œ κ°€μ§€λ§Œ μˆ˜ν–‰ν•΄μ•Ό ν•œλ‹€λŠ” 것을 더 ν™•κ³ ν•˜κ²Œ 믿게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€. κ·Έλ ‡κ²Œ ν•˜λ €λ©΄ DjangoλŠ” obj λ₯Ό 더 λ©‹μ§€κ²Œ 닀루어야 ν•©λ‹ˆλ‹€.

λ‚΄κ°€ Django에 보낸 νŒ¨μΉ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€: https://github.com/django/django/pull/9581 (κ°€λŠ₯ν•˜λ©΄ λŒ“κΈ€μ„ λ‹¬μ•„μ£Όμ„Έμš”). 그것을 λ§Œλ“œλŠ” 것듀, μš°λ¦¬λŠ” Guardian에 μžˆλŠ” λͺ¨λ“  κ³³μ—μ„œ λͺ¨λΈ κΆŒν•œ 검색을 μ •λ¦¬ν•˜κ³  κΈ°λ³Έ λ°±μ—”λ“œλ₯Ό ν˜ΈμΆœν•˜κΈ°λ§Œ ν•˜λ©΄ λ©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰

κ΄€λ ¨ 문제

BenDevelopment picture BenDevelopment  Β·  5μ½”λ©˜νŠΈ

g-as picture g-as  Β·  10μ½”λ©˜νŠΈ

David-OConnor picture David-OConnor  Β·  6μ½”λ©˜νŠΈ

johnthagen picture johnthagen  Β·  9μ½”λ©˜νŠΈ

lukaszb picture lukaszb  Β·  14μ½”λ©˜νŠΈ