PDA

View Full Version : سوال: تعیین سطوح دسترسی کاربران ؟



malihehshajari
شنبه 26 بهمن 1392, 13:15 عصر
سلام

میخوام برای کاربر ها سطح دسترسی به قسمت های مختلف برنامه رو تعریف کنم

میشه راهنمایی کنید ؟

n.nowroozi
شنبه 26 بهمن 1392, 13:46 عصر
منظورت روی جنگو هست؟!
اگه آره جنگو به صورت پیش فرض سه تا پرمیشن واسه ساخت،ادیت و پاک کردن برای هر کلاس مدلتون در اختیار شما قرار میده که توی کلاس Permission ذخیره میشه.


from django.contrib.auth.models import Permission
Permission.objects.all()

میتونید کلیه پرمیشن هارو با دستور بالا ببینید.
اگه پرمیشنهای بالا کارتون رو راه نمیندازه باید پرمیشنهای مورد نظر خودتون رو ایجاد کنید.. پرمیشنهای جنگو رو باید با یکی از مدلهاتون ارتباط بدید به صورت مثال:

class CustomUser(AbstractUser):
pass
class Meta:
permissions = (
('perm1', 'detail about perm'),
('perm2', 'detail about perm'),

)
من معمولا ارتباطش میدم با مدل user اما شما میتونید به هر مدل دیگه ای هم اضافه کنید.
راه دیگش هم درج مستقیم در مدل Permission هست:


from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
from yourmodel.models import model_name
content_type = ContentType.objects.get_for_model(model_name)
permission = Permission.objects.create(codename='permission_nam e',
name='permissio_description',
content_type=content_type)

در انتها میتونید پرمیشنها را ابتدا به یک گروه اختصاص بدید و بعد گروه رو به یوزرتون اضافه کنید یا پرمیشنها رو به صورت مستقیم به یوزر اختصاص بدید.
و در نهایت برای هر تابع از متد has_perm در user استفاده کنید و چک کنید که یوزر دسترسی داره یا نه.


موفق باشید

malihehshajari
شنبه 26 بهمن 1392, 14:10 عصر
خود جنگو سه تا مدل میسازه user , permission , user_user_permission

این درسته که با دسترسی مستقیم به جدول permission سطوح دسترسی رو درج کنم

بعد توی جدول user_user_permission ارتباط بین کاربران و سطوح دسترسی رو تعریف کنم

بعد بر اساس این روابط به قسمت های مختلف برنامه دسترسی ایجاد کنم ؟

n.nowroozi
شنبه 26 بهمن 1392, 14:21 عصر
ببینید اگه به صورت مستقیم توی مدل permission ثبت کنید اگه برنامه تون دیتابیسش به هر دلیلی ریست بشه پرمیشنهای شما دیگه وجود خارجی ندارند پس توصیه من اینه که در مدلتون بنویسید .
شما اول باید دسترسی هایی که نیاز دارید رو تعریف کنید بعد یک سری گروه با توجه به دسته بندی هایی که توی سیستمتون دارید تعریف کنید. پرمیشنهای مورد نیاز به هرگروه رو اختصاص بدید و بعد به صورت یک decorator (یا هر شیوه ای که خودتون ترجیح میدید)بالای تابع یا متدهاتون میتونید بررسی کنید که کاربر پرمیشن داره یا نه.

malihehshajari
شنبه 26 بهمن 1392, 15:17 عصر
ببینید من یدونه مدل برای گسترش مدل user نوشتم :



class UserProfile(models.Model):
user = models.OneToOneField(User)
verified = models.BooleanField()
title = models.CharField(max_length = 255, blank = True)
phone = models.CharField(max_length = 255, blank = True)
user_name_save = models.CharField(max_length = 50)
date_time_save = jmodels.jDateField()
bit_delet = models.BooleanField()
user_name_delet = models.CharField(max_length = 50)
date_time_delet = jmodels.jDateField()
bit_edit = models.BooleanField()
user_name_edit = models.CharField(max_length = 50)
date_time_edit = jmodels.jDateField()


بعد به صورت زیر سطوح دسترسی تعریف کنم :



class CustomUser(UserProfile):
pass
class Meta:
permissions = (
('perm1', 'detail about perm'),
('perm2', 'detail about perm'),

)




بعدش چی من اصلا متوجه نمیشم :گریه:

n.nowroozi
شنبه 26 بهمن 1392, 16:04 عصر
class UserProfile(models.Model):
user = models.OneToOneField(User)
verified = models.BooleanField()
title = models.CharField(max_length = 255, blank = True)
phone = models.CharField(max_length = 255, blank = True)
user_name_save = models.CharField(max_length = 50)
date_time_save = jmodels.jDateField()
bit_delet = models.BooleanField()
user_name_delet = models.CharField(max_length = 50)
date_time_delet = jmodels.jDateField()
bit_edit = models.BooleanField()
user_name_edit = models.CharField(max_length = 50)
date_time_edit = jmodels.jDateField()
class Meta:
permissions = (
('perm1', 'detail about perm'),
('perm2', 'detail about perm'),

)
به عنوان مثال به شکل بالا باید تعریف بشه. ولی یک مشکلی که کدتون داره اینه که یوزر پروفایل رو جنگو تا جایی که من میدونم از ورژن ۱.۵ شدیدا توصیه میکنه که ازش استفاده نکنید باید به شکل AbstractUser تعریف کنید توی متد جدید

n.nowroozi
شنبه 26 بهمن 1392, 16:06 عصر
User Profile Deprecated

They have officially deprecated the use of user profiles attached to the default user in favor of custom user models. Custom user models should be setup on initial project creation. If you didn’t do this then you can use something like South to migrate your data. The easiest way to create a custom user model is shown below by extending the base Django user and just adding to it.
settings.py

AUTH_USER_MODEL = 'myapp.CustomUser'


AUTH_USER_MODEL = 'myapp.CustomUser'

models.py

from django.contrib.auth.models import AbstractUser class CustomUser(AbstractUser): keyboard_shortcuts = models.BooleanField(default=True)


from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
keyboard_shortcuts = models.BooleanField(default=True)

Now anywhere you would make a foreign key to User you’ll need to import settings and use settings.AUTH_USER_MODEL instead of User.
models.py

from django.conf import settings class SomeData(models.Model): .... user = models.ForeignKey(settings.AUTH_USER_MODEL)


from django.conf import settings

class SomeData(models.Model):
....
user = models.ForeignKey(settings.AUTH_USER_MODEL)
منبع:
http://ericsaupe.com/tag/django-1-6/

malihehshajari
شنبه 26 بهمن 1392, 16:14 عصر
ولی این روش داره برای من جواب میده و مشکلی نداره

حالا سوال من اینه که من چطور به هر کاربری سطح دسترسی خاصی رو اختصاص بدم ؟؟
من نمیخوام از admin خود جنگو استفاده کنم آخه

ببخشید که انقدر میپرسم
این قسمتش اصلا برام مفهوم نیست توی جنگو :گریه:

malihehshajari
شنبه 26 بهمن 1392, 16:37 عصر
یچیزایی فهمیدم
برای هر مدلی سطوح دسترسی که وجود داره رو تعریف کنم به روش بالا
بعد برم اونا رو توی فرمم همه رو نشون بدم
و برای هر کار بر هر کدوم که لازمه انتخاب کنم و ثبت کنم
و بعد با دستور :



@permission_required('polls.can_vote', login_url="/login/")


بررسی کنم که آیا این سطح دسترسی رو داره یا نه

درسته ؟؟؟؟؟؟؟؟؟؟؟؟؟

n.nowroozi
شنبه 26 بهمن 1392, 16:43 عصر
جملم رو اصلاح کردم گفتند شدیدا توصیه میکنند که استفاده نکنید.
خب شما باید یک ویو جدا طراحی کنید واسه دسترسی ها و مثلا دسترسیهارو fetch کنید از مدل Permission به یوزرتون نمایش بدید. بعد دسترسی هارو انتخاب کنید مثلا یک فرم بسازید که دسترسی ها توش باشه و بعد یوزر رو انتخاب کنه . بعد شما بیا فرمت رو تحلیل کن توی ریکوئست پست و مثلا یوزر رو گرفتی از مدلت دسترسی هارو بهش اختصاص بده:


user = User.objects.get(username=username)
perm = Permission.objects.get(codename=permission_name)
user.user_permissions.add(perm)

n.nowroozi
شنبه 26 بهمن 1392, 16:47 عصر
یچیزایی فهمیدم
برای هر مدلی سطوح دسترسی که وجود داره رو تعریف کنم به روش بالا
بعد برم اونا رو توی فرمم همه رو نشون بدم
و برای هر کار بر هر کدوم که لازمه انتخاب کنم و ثبت کنم
و بعد با دستور :



@permission_required('polls.can_vote', login_url="/login/")


بررسی کنم که آیا این سطح دسترسی رو داره یا نه

درسته ؟؟؟؟؟؟؟؟؟؟؟؟؟
آره درسته :)

malihehshajari
شنبه 26 بهمن 1392, 16:55 عصر
الان من اینجوری نوشتم




class Dr(models.Model):
name = models.CharField(max_length = 50)
family = models.CharField(max_length = 50)
number = models.CharField(max_length = 50)
Specialization = models.CharField(max_length = 50)
user_name_save = models.CharField(max_length = 50)
date_time_save = jmodels.jDateField()
bit_delet = models.BooleanField()
user_name_delet = models.CharField(max_length = 50)
date_time_delet = jmodels.jDateField()
bit_edit = models.BooleanField()
user_name_edit = models.CharField(max_length = 50)
date_time_edit = jmodels.jDateField()

class Meta:
permissions = (
('a', 'دسترس یه صفحه پذیرش '),
('b', 'دسترسی به صفحه تست'),

)



و از طریق صفحه adminجنگو سطح دسترسی رو گذاشتم روی a

و کد زیر رو قبل از تابع نوشتم



@login_required(login_url='/login/')
@permission_required('a', login_url="/login/")


ولی با اینکه این سطح دسترسی براش مجاز شده میندازه بیرون کار بر رو چرا ؟؟؟؟؟؟؟؟؟؟؟

n.nowroozi
شنبه 26 بهمن 1392, 17:46 عصر
python manage.py shell

from django.contrib.auth.models import User
user = User.objects.get(username='user')
user.has_perm('a')
خب یه تست بگیر با دستورات بالا ببین واسه اون یوزری که میگی دسترسی ست کردی True برمیگیردونه یا نه

malihehshajari
شنبه 26 بهمن 1392, 18:04 عصر
False رو بر میگردونه :عصبانی++:

n.nowroozi
شنبه 26 بهمن 1392, 18:27 عصر
خب پس درست ست نکردی. واسه ست کردن چیکار میکنی؟

malihehshajari
شنبه 26 بهمن 1392, 19:51 عصر
خب پس درست ست نکردی. واسه ست کردن چیکار میکنی؟

رفتم داخل ادمین خود جنگو از داخل سطح دسترسیا اونی رو که خواستم انتخاب کردم بعد با اون فلشی که داشت انتقالش دادم سمت مقابل بعد تغییرات رو ذخیره کردم

n.nowroozi
شنبه 26 بهمن 1392, 21:33 عصر
هووووم نمیدونم چرا میلنگه. اگه پروژتون بزرگه از ادمین استفاده نکنید واسه پروژه های کوچیک خوبه کارو سریع جلو میبره اما یه جاهایی بد دست آدم رو میبنده به نظرم همین داستان رو دستی بنویس که راحتم بتونی باگ گیریش کنی.
حالا در هر صورت دوباره میری توی اون صفحه واسه اون یوزر همون دسترسی ست شده؟ اگه آره خروجی این رو برای اون یوزری که ست کردی برام بزار:


myuser = User.objects.get(username='user')
perm = myuser.user_permissions.all()
for i in perm:
print i.codename

malihehshajari
یک شنبه 27 بهمن 1392, 09:27 صبح
هیچ چیزی بر نگردوند

الان از توی برنامه با کدی که گفتید توی پست های بالا یدونه سطح دسترسی براش تعریف کردم و اون سطح دسترسی رو الان بر میگردونه
ولی بازم با سطح دسترسی که محدودش میکنم منو میندازه بیرون از صفحه :(

n.nowroozi
یک شنبه 27 بهمن 1392, 10:49 صبح
خروجی همون دستور رو بعد از اینکه ست کردی بنویس اینجا

malihehshajari
یک شنبه 27 بهمن 1392, 10:55 صبح
خروجی همون دستور رو بعد از اینکه ست کردی بنویس اینجا



user = User.objects.get(username= 'b')
perm = Permission.objects.get(codename= 'b')
user.user_permissions.add(perm)

check = False

myuser = User.objects.get(username='b')
perm = myuser.user_permissions.all()
for i in perm:
if i.codename == 'b' :
check = True



خروجی check = True

اگه دستی خودم کنترل کنم سطح دسترسی رو با کد بالا ایرادی داره ؟ چون اون اصلا جواب نمیده برام
ممکنه بخاطر userprofile که برای گسترش مدل user نوشتم باشه ؟

n.nowroozi
یک شنبه 27 بهمن 1392, 11:15 صبح
@permission_required('b', login_url="/login/")
الان این رو میزاری کار نمیکنه؟!
خب یا برو توی خود دکوریتور نگاه کن ببین مشکل چیه یا یه دکوریتور خودت دستی بنویس اما قاعدتا نباید مشکلی باشه!

malihehshajari
یک شنبه 27 بهمن 1392, 11:47 صبح
@permission_required('b', login_url="/login/")
الان این رو میزاری کار نمیکنه؟!
خب یا برو توی خود دکوریتور نگاه کن ببین مشکل چیه یا یه دکوریتور خودت دستی بنویس اما قاعدتا نباید مشکلی باشه!

بله کار نمیکنه
کلا False میشه نتیجش
خودم دستی مینویسم دیگه
ممکنه بخاطر userprofile که برای گسترش مدل user نوشتم باشه ؟

واقعا ممنونم از راهنمایی هایی که کردید و برام وقت گذاشتید خیلی شرمنده ام :لبخندساده:

n.nowroozi
یک شنبه 27 بهمن 1392, 12:32 عصر
بله کار نمیکنه
کلا False میشه نتیجش
خودم دستی مینویسم دیگه
ممکنه بخاطر userprofile که برای گسترش مدل user نوشتم باشه ؟

واقعا ممنونم از راهنمایی هایی که کردید و برام وقت گذاشتید خیلی شرمنده ام :لبخندساده:
خواهش میکنم کاری نکردم.
والا چی بگم اگه تو خود دکوریتور نگاه کنید بهتر معلوم میشه که داستان چیه. اما توی داکیومنت جنگو از ۱.۵ شدیدا توصیه کردند که از userprofile استفاه نکنید نمیدونم حالا واسه چی.