مرجع تخصصی برنامه نویسان

انجمن تخصصی برنامه نویسان فارسی زبان

کاربر سایت

alibahman47

عضویت از 1395/11/13

روش بدست آورن Role کاربر ؟ و جستجوی کاربران بر اساس Role ها در Identity 2.1 ؟

  • پنجشنبه 5 مرداد 1396
  • 10:57
تشکر میکنم

درود ,

در ابتدا سوال خیلی مهمی که برام پیش اومده اینه که چرا در ساختار Identity از جدول UserRoles استفاده شده ؟!!!

بدوم جدول UserRoles هم براحتی میتوان بین جداول Users و Roles ارتباط برقرار کرد و Role مربوط به هر کاربر را مشخص کرد - این دقیقا کاری است که من در کل پایگاه داده هایی که تا به حال طراحی کردم استفاده میکنم و هیچگاه برای ارتباط بین دو جدول از ی جدول واسط بینشون استفاده نمیکنم و هیچ دلیلی هم برای استفاده نیست.

سوالات :

1- دوستانی که تخصص و اطلاعات کامل تری دارند درصورت امکان یه توضیح کوتاه بدن که چرا از جدول UserRoles استفاده شده و آیا میشه کلا برش داشت و حذفش کرد یا بخاطر امنیت یا مسله دیگه ای وجودش ضروری هست ؟

2 - اگر جدول UserRoles وجود نداشت به راحتی میشد در زمان نمایش کل کاربران , نام role هر کاربر را بدست آورد یا بر اساس یک نام role (که از کاربر دریافت شود) فقط کاربرانی که اون نقش رو دارند جستجو کرد و برگشت داد ولی با توجه به این جدول واسطه همه چیز برای من برای انجام این کار ها غیر ممکن شده و نمیدونم چطوری باید کدش رو نوشت !

با توجه به رابطه فعلی جداول  کد مربوط به دوتا کار زیر به چه شکله ؟

3 - نمایش Name مربوط به Role یک کاربر  (البته در زمانی که همه کاربران رو در یک جدول پیجر نمایش میدیم - یعنی در هر سط که اطلاعات کاربر نمایش می یابد نقش اون هم نمایش یابد) ؟

4 - Name یک Role را بگیریم و کاربرانی که فقط آن نقش را دارند جستجو کنیم ؟

پاسخ های این پرسش

تعداد پاسخ ها : 6 پاسخ
کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • پنجشنبه 5 مرداد 1396
  • 12:41

1)علت ایجاد جدول UserRoles پیدا سازی رابطه چند به چند است که در صورت ایجاد نکردن آن EF به صورت خودکار آن را ایجاد می کند. اگر بخواهیم نگاه عمیقی به این مسئله داشته باشم ایجاد جدول واسط برای جلوگیری از JayWalking Anti Pattern(و آنتی پترن های دیگر که در SQL قرارد دارد) می باشد. که خودش جای بحث دارد، در کل این را درنظر بگیرید که این کار مجبوب بهبودی عملکر اجرای کوئری برروی بانک می باشد.

2) برای به دست آوردن Role یک کاربر یا مسائلی مشابه آن می توان از چند طریق این کار را انجام داد، یکی Claims، دیگری استفاده از کلاس های RoleManager<> یا UserManager .

3) مثال: ^

کاربر سایت

alibahman47

عضویت از 1395/11/13

  • پنجشنبه 5 مرداد 1396
  • 22:17

در مورد ارتباط چند به چند که توضیح دادید در پروژه ای که در حال تکمیلش هستم نیاز نشده که از ارتباط چند به چند یا پیچیتری برای کاربران استفاده کنم و البته شاید دلیل اینه که با وجود مطالب زیادی که راجب Identity خوندم ولی هنوز بخوبی درکش نکردم (این تنها موردی هست که تو کل مباحثی که در Asp.net Mvc باهاش مواجه شدم بخوبی یادش نگرفتم )و البته خود این شاید یه دلیل این باشه که من از روش Data Base First استفاده میکنم و و بدلیل Code First کار نکردن , درک عمیقی از Code First ندارم .)

در پروژه جاری بنده که یک فروشگاه اینترنتی هست بنظر من برای هر کاربر فقط داشتن یک Role کفایت میکنه , چون وقتی یک کاربر مثلا نقش PrimaryAdmin (به معنی مدیر کل سایت) رو داره قطعا به تمام قسمت های سایت دسترسی رو خواهد داشت و دیگه نیازی نیست Role های Assistant یا Member یا هر Role سطح پایینتری رو بهش بدیم.

این مورد که لینک دادید برای بدست اوردن همه کاربران در یک نقش خاص بود و جواب یکی از سوال هام بود 

برای سوال دیگه که پرسیدم : در زمانی که داریم لیست همه کاربران رو نشون میدم اگر بخوام در هر سطری که اطلاعات یک کاربر نمایش می یابد نام Role (یا role ها) را هم نشان دهیم , چه کدی باید نوشت ؟



توجه کنید که در View این کد رو باید بنویسیم !


کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • پنجشنبه 5 مرداد 1396
  • 23:22

مشکل شما اینجاست که شما یک Role برای هر کاربر تایین می کنید اما کاربر می تواند چند Role داشته باشد , لازم است برای واکشی نام Role از foreach در view استفاده کنید

Identity 2.0 به صورت Code First پیاده سازی شده و استفاده از آن در کنار DbFirst پیشنها نمی کنم(نه که نشود، می شود ممکن است در حین توسعه اختلالی ایجاد شود).

شما میتوانید به راحتی با استفاده از متد GetRolesAsync که در کلاس UserManager قرار دارد به راحتی یک لیست string که شامل نام Role های کاربر می باشد را دریافت کنید.

یک مثال کامل

از این که سوالتون بسیار واضح و کامل بیان می کنید سپاس گذارم دوست عزیز. :)

کاربر سایت

alibahman47

عضویت از 1395/11/13

  • شنبه 7 مرداد 1396
  • 11:40

ممنون از راهنمایی ها ,

من در قسمت نمایش جزییات اطلاعات یک کاربر از کلاس  UserManager و تابع GetRolesAsync  به صورت زیر استفاده کردم و Role Nameهای یک کاربر رو نشون میدم (یعنی در سمت کنترولر با این کلاس کار کرده و Role Name ها رو با ViewBag به سمت View میفرستم )  بنده این رو انجام دادم و دیگه حله(البته با کمک های شماheart) :

Name:  MyCode.png
Views: 0
Size:  30.0 کیلوبایت

حالا من برای موقعی هست که لیست تمامی کاربران را نمایش میدهیم :




اگر بخواهیم در هر سط نام Role های هر کاربر نمایش یابد باید در سمت View چه کدی را نوشت ؟

امیدوارم منظورم رو رسونده باشم !

کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • شنبه 7 مرداد 1396
  • 13:37

با استفاده از ViewModel میتوانید این مشکل را حل کنید : مثال

کاربر سایت

alibahman47

عضویت از 1395/11/13

  • دوشنبه 9 مرداد 1396
  • 10:39

با توجه به پیدا نکردن جواب سوال در فروم های دیگه هم سوال رو پرسیده بودم , ولی یه جواب های عجیب غریب و پیچیده ای رو پست ها میزاشتن که آدم کلا هر چی کدنویسی هم میدونست یادش میرفت همش هم الکلی و بی ربط و بدون خرجی درست.

ممنون از شما  , جواب های شما همه دقیق و حساب شدست ,  این دقیقا همون چیزی بود که میخواستم .

واقعا دمت گرمheart

کاربرانی که از این پست تشکر کرده اند

هیچ کاربری تا کنون از این پست تشکر نکرده است

اگر نیاز به یک مشاور در زمینه طراحی سایت ، برنامه نویسی و بازاریابی الکترونیکی دارید

با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)