PDA

View Full Version : ایجاد سیستم Login کاربر



Ir.WebDeveloper
دوشنبه 17 خرداد 1389, 07:45 صبح
سلام در یک برنامه ویندوزی(win app)
چطور میشه مثل وب کاربرانی با Role های مختلف تعریف کرد؟در اینکه نیاز به جدول می باشد و به ازای هر کاربر هم یک جدول که Role ها در اون هستند که شکی نیست،اما وقتی کاربر Login کرد این اطلاعات رو کجا نگه داریم؟چون بعداز چک کردن صحت اعتبار فرم اولیه login بسته و از حافظه خارج میشه،حالا مثلا در فرم تغییر اطلاعات پرسنلی از کجا بفهمیم کاربر مجوز دیدن را داره یا نه؟یا میتونه edit کنه یا فقط ReadOnly یا ...
چطور امکان داره؟

hamidreza20
دوشنبه 17 خرداد 1389, 10:49 صبح
سلام در یک برنامه ویندوزی(win app)
چطور میشه مثل وب کاربرانی با Role های مختلف تعریف کرد؟در اینکه نیاز به جدول می باشد و به ازای هر کاربر هم یک جدول که Role ها در اون هستند که شکی نیست،اما وقتی کاربر Login کرد این اطلاعات رو کجا نگه داریم؟چون بعداز چک کردن صحت اعتبار فرم اولیه login بسته و از حافظه خارج میشه،حالا مثلا در فرم تغییر اطلاعات پرسنلی از کجا بفهمیم کاربر مجوز دیدن را داره یا نه؟یا میتونه edit کنه یا فقط ReadOnly یا ...
چطور امکان داره؟

سلام دوست گرامی

برای این منظور از یک کلید به عنوان سطح دسترسی استفاده می کنند . مثلا هنگام ورود بررسی می کنند که کاربر چه سطح دسترسی دارد و سپس به آن کلید مقدار مورد نظر را اختصاص می دهند و سپس در فرم اصلی برنامه آن را چک و یکسری از منوها و باتن ها و یا فرم ها را برای آن کاربر غیرفعال می کنند .

التماس دعا...

Ir.WebDeveloper
دوشنبه 17 خرداد 1389, 11:39 صبح
چطوری فرمی که هنوز لود نشده باتن هاش Disable بشه؟
بعضی جاها بنده فرم های تو در تو دارم و هر فرم فرمی دیگر را صدا می زند،یعنی فرم آخری که صدا زده شد باید به نسبت نوع کاربر بعضی از بخش هاش فعال و بعضی دیگر غیر فعال باشد!
درسته ابتدای برنامه وقتی کاربر login کرد اطلاعاتشو داریم،اما این اطلاعات رو چه طوری و در کجا باید نگه داشت که وقتی مورد بالا پیش اومد اطلاعاتشو داشته باشیم...؟؟؟
ضمنا منظور شما از کلید در سطح برنامه است یا در سطح Database ؟اگر در برنامه است چطوری تعریف می شود؟؟؟

hamidreza20
دوشنبه 17 خرداد 1389, 11:49 صبح
چطوری فرمی که هنوز لود نشده باتن هاش Disable بشه؟
بعضی جاها بنده فرم های تو در تو دارم و هر فرم فرمی دیگر را صدا می زند،یعنی فرم آخری که صدا زده شد باید به نسبت نوع کاربر بعضی از بخش هاش فعال و بعضی دیگر غیر فعال باشد!
درسته ابتدای برنامه وقتی کاربر login کرد اطلاعاتشو داریم،اما این اطلاعات رو چه طوری و در کجا باید نگه داشت که وقتی مورد بالا پیش اومد اطلاعاتشو داشته باشیم...؟؟؟
ضمنا منظور شما از کلید در سطح برنامه است یا در سطح Database ؟اگر در برنامه است چطوری تعریف می شود؟؟؟

اگر شما از Win Form Application استفاده می کنی یک فرم به عنوان فرم اصلی در نظر گرفته می شه . شما می تونی توی اون فرم یک متغییر از نوع public تعریف کنی و پس از login مقدار مورد نظر رو به اون اختصاص دهی بعد هر گاه خواستی فرمی را باز کنی ( چه تو در تو یا !!!!!!) اون رو چک می کنی و کنترل ها رو غیر فعال می کنی... فرم اصلی برنامه ات به عنوان parrent در نظر گرفته می شه و وقتی بسته بشه تمام فرم های بعد از آن بسته می شوند.

ابتدا سطح دسترسی ها رو تعریف کن و ببین هر کاربر باید به چه فرم ها و کنترل هایی دسترسی داشته باشه سپس اعمال فوق رو روی آنها پیاده کن...

من در یک پروژه ثبت نام یک آموزشگاه از این روش استفاده کردم...

التماس دعا...

Ir.WebDeveloper
دوشنبه 17 خرداد 1389, 14:33 عصر
سلام
ممنون از شما،
اشکالم در همون متغیر Public بود...
البته Parent یک اصطلاحه که شما استفاده کردید دیگه نه؟(یعنی منظورتون این نیست که از MDI Parent باید استفاده کنم؟)

hamidreza20
دوشنبه 17 خرداد 1389, 16:13 عصر
سلام
ممنون از شما،
اشکالم در همون متغیر Public بود...
البته Parent یک اصطلاحه که شما استفاده کردید دیگه نه؟(یعنی منظورتون این نیست که از MDI Parent باید استفاده کنم؟)

خواهش می کنم دوست گرامی. بله Parent اصطلاحی است که به فرم پدر یا همون فرم اصلی گفته می شود . منظور من MDI نبود .

التماس دعا...

Ir.WebDeveloper
سه شنبه 18 خرداد 1389, 17:08 عصر
فقط یک مشکل که کمی به نظرم مبهمه،اینکه بنده فرم های زیادی دارم که تو هر کدوم اعمال زیادی از قبیل "درج" و"ویرایش" و... که هر یک از کاربران به بخشی از این فرم ها دسترسی دارند،در اونصورت دیگه فکر نمیکنم با یک تعریف یک متغیر(فیلد)کارم راه بیفته و باید تو هر فرم که هستم username کاربر رو به متد مربوطه بفرستم تا بگه مجوزهاش چیه،اینطور نیست؟یا راه بهتری دیگه ای هست؟

FastCode
سه شنبه 18 خرداد 1389, 18:58 عصر
فقط یک مشکل که کمی به نظرم مبهمه،اینکه بنده فرم های زیادی دارم که تو هر کدوم اعمال زیادی از قبیل "درج" و"ویرایش" و... که هر یک از کاربران به بخشی از این فرم ها دسترسی دارند،در اونصورت دیگه فکر نمیکنم با یک تعریف یک متغیر(فیلد)کارم راه بیفته و باید تو هر فرم که هستم username کاربر رو به متد مربوطه بفرستم تا بگه مجوزهاش چیه،اینطور نیست؟یا راه بهتری دیگه ای هست؟
راه استاندارد(از نظر من) اینه که شما یه سینگلتون داشته باشی و کلاس کاربر رو توی اون ذخیره کنی.
بعد هر کاربر یه لیست سطح دسترسی داشته باشه و هر کدوم از اون ایتم ها یه role و یه state
و هر جایی که نیاز یه سطح دسترسی داشتی در BL لیست role های user رو برای اون role به خصوص جست و جو کنی و state رو برگردونی و اگر role وجود نداشت و از تنظیمات پیشفرض(access denied)استفاده کنید.و اگر از دیتاست ست استفاده میکنی, پیشاپیش برای کدهایی که مینویسی متاسفم و باید بگم که اصلا" حوصله گفتن و توضیح دادن این کار تو دیتاست رو ندارم(چون عملا" غیر ممکنه)

Ir.WebDeveloper
سه شنبه 18 خرداد 1389, 21:26 عصر
راه استاندارد(از نظر من) اینه که شما یه سینگلتون داشته باشی و کلاس کاربر رو توی اون ذخیره کنی.
بعد هر کاربر یه لیست سطح دسترسی داشته باشه و هر کدوم از اون ایتم ها یه role و یه state
و هر جایی که نیاز یه سطح دسترسی داشتی در BL لیست role های user رو برای اون role به خصوص جست و جو کنی و state رو برگردونی و اگر role وجود نداشت و از تنظیمات پیشفرض(access denied)استفاده کنید.و اگر از دیتاست ست استفاده میکنی, پیشاپیش برای کدهایی که مینویسی متاسفم و باید بگم که اصلا" حوصله گفتن و توضیح دادن این کار تو دیتاست رو ندارم(چون عملا" غیر ممکنه)

یک سری چیزها تو پاسخ شما برای بنده نامفهومه،مثله سینگلتون و BL، میشه بیشتر توضیح بدین؟و اینکه بنده از Dataset یا DataTable استفاده میکنم چه ارتباطی با Authentication کردن User میتونه داشته باشه و برای روش شما از چی باید استفاده شه اصلا...
بیشتر توضیح بدین لطفا.
با تشکر از شما.

Ir.WebDeveloper
جمعه 21 خرداد 1389, 11:58 صبح
راه استاندارد(از نظر من) اینه که شما یه سینگلتون داشته باشی و کلاس کاربر رو توی اون ذخیره کنی.
بعد هر کاربر یه لیست سطح دسترسی داشته باشه و هر کدوم از اون ایتم ها یه role و یه state
و هر جایی که نیاز یه سطح دسترسی داشتی در BL لیست role های user رو برای اون role به خصوص جست و جو کنی و state رو برگردونی و اگر role وجود نداشت و از تنظیمات پیشفرض(access denied)استفاده کنید.و اگر از دیتاست ست استفاده میکنی, پیشاپیش برای کدهایی که مینویسی متاسفم و باید بگم که اصلا" حوصله گفتن و توضیح دادن این کار تو دیتاست رو ندارم(چون عملا" غیر ممکنه)

روشه شما بدلیل عدم کفایت توضیحات شما برای بنده کارایی نداشت،کسی پیشنهاده بهتری نداره؟

akarsu
شنبه 22 خرداد 1389, 00:47 صبح
چطوری فرمی که هنوز لود نشده باتن هاش Disable بشه؟
بعضی جاها بنده فرم های تو در تو دارم و هر فرم فرمی دیگر را صدا می زند،یعنی فرم آخری که صدا زده شد باید به نسبت نوع کاربر بعضی از بخش هاش فعال و بعضی دیگر غیر فعال باشد!
درسته ابتدای برنامه وقتی کاربر login کرد اطلاعاتشو داریم،اما این اطلاعات رو چه طوری و در کجا باید نگه داشت که وقتی مورد بالا پیش اومد اطلاعاتشو داشته باشیم...؟؟؟
ضمنا منظور شما از کلید در سطح برنامه است یا در سطح Database ؟اگر در برنامه است چطوری تعریف می شود؟؟؟
دوست عزيز
شما مي‌تونيد در فرم login خود متغييرهايي از نوع public static bool تعريف كني و در هر فرمي كه خواستي اونو فراخواني كني كه در اين صورت مي‌توني هر قسمتي را كه خواستي فعال و يا غیر فعال كني
اگه ميشه بگي كه پروژه رو با چه مينويسي sql يا accessو... شايد بتونم دقيق‌تر كمكت كنم

FastCode
شنبه 22 خرداد 1389, 09:29 صبح
یک سری چیزها تو پاسخ شما برای بنده نامفهومه،مثله سینگلتون و BL، میشه بیشتر توضیح بدین؟و اینکه بنده از Dataset یا DataTable استفاده میکنم چه ارتباطی با Authentication کردن User میتونه داشته باشه و برای روش شما از چی باید استفاده شه اصلا...
بیشتر توضیح بدین لطفا.
با تشکر از شما.
singleton یه design pattern هست.
BL = Business layer(شما اصلاً این لایه رو ندارید.)
یعنی شما وقتی میخواهی یه user رو logon کنی, پس از انجام کنترلهای لازم(رمز و فعال بودن و ...) اون رو یه جایی ذخیره کنید.(یه singleton)
بعد هر موقع که یوزر میخواست کاری انجام بده,بخش Data Access control که توی یا کنار(کنار بهتره) Data Access layer شما قرار داره توی role های تعریف شده برای کاربر دنبال اون role میگرده و در صورت لزوم(عدم دسترسی) جلوی کاربر رو میگیره و یه exception به UI میفرسته و UI اون رو به کاربر نمایش میده.

Ir.WebDeveloper
شنبه 22 خرداد 1389, 21:50 عصر
singleton یه design pattern هست.
BL = Business layer(شما اصلاً این لایه رو ندارید.)
یعنی شما وقتی میخواهی یه user رو logon کنی, پس از انجام کنترلهای لازم(رمز و فعال بودن و ...) اون رو یه جایی ذخیره کنید.(یه singleton)
بعد هر موقع که یوزر میخواست کاری انجام بده,بخش Data Access control که توی یا کنار(کنار بهتره) Data Access layer شما قرار داره توی role های تعریف شده برای کاربر دنبال اون role میگرده و در صورت لزوم(عدم دسترسی) جلوی کاربر رو میگیره و یه exception به UI میفرسته و UI اون رو به کاربر نمایش میده.
ممنون از پاسخ شما.
چرا دارم،البته بنده این لایه رو با نام( BLL(Business Logic Layer می شناسم و در مورد سینگلتون هم تصور میکنم یک فیلد ساده همون کار رو انجام میده،چون سینگلتون طبق چیزی که بنده فهمیدم روشی است برای اینکه نتوان از یک کلاس بیش از یکبار کلاسی رو مشتق کرد...
http://en.wikipedia.org/wiki/Singleton_pattern
اما باز هم ممنون که نظرتون رو گفتید.

Ir.WebDeveloper
یک شنبه 23 خرداد 1389, 17:16 عصر
دوست عزيز
شما مي‌تونيد در فرم login خود متغييرهايي از نوع public static bool تعريف كني و در هر فرمي كه خواستي اونو فراخواني كني كه در اين صورت مي‌توني هر قسمتي را كه خواستي فعال و يا غیر فعال كني
اگه ميشه بگي كه پروژه رو با چه مينويسي sql يا accessو... شايد بتونم دقيق‌تر كمكت كنم
ببخشید دیر پست شما رو دیدم
بله حتما... با SQL می نویسم...
مشکل بنده خیلی ریز تر از تعریف یک متغیره،اینکه تازه ابتدای کاره...
تصور کنید یک جدول رو که کاربران با اطلاعات ورود و ... با جدولی دیگر(به طور یک به چند)شامل نام صفحات و مجوز نمایش،حذف و درج و... را به ازای هر صفحه برای کاربران مختلف...
حالا این اطلاعات جدول دوم رو که شامل صفحاتی هست که کاربر میتونه بهشون دسترسی داشته باشه رو بهتره در چی نگه دارم،نظره خودم آرایه است،اما دوست داشتم نظر دوستان رو هم جویا شم(یعنی ابتدای کار که کاربر Login میکنه نام صفحاتی که میتونه بهشون دسترسی داشته باشه را در یک آرایه میریزم بعد اگر اصلا این صفحه تو لیستش بود میرم تو بانک بررسی میکنم که مجوزاش چیه!!!)
خب البته یکی از عیب هاش اینه که به ازای هر صفحه برای هر کاربر که اسم صفحه تو جدول مربوطش هست باید یکبار به بانک وصل شد...
(یعنی اگه میشد به طور اصولی همون ابتدای کار همه ی مجوزها و صفحات قابل دستیابیشم یکجا ابتدای Login ذخیره میکردیم خیلی بهتر بود...)
منتظر نظرات دوستان هستم.
با تشکر از همه ی شما.

akarsu
یک شنبه 23 خرداد 1389, 18:41 عصر
دوست عزيز به جاي گفتن يه نمونه كد مينويسم با روشي كه ميدونم و برات ميفرستم

Ir.WebDeveloper
یک شنبه 23 خرداد 1389, 21:27 عصر
دوست عزيز به جاي گفتن يه نمونه كد مينويسم با روشي كه ميدونم و برات ميفرستم
دوست من بنده به دلیل تعداد ارسال های کم موفق به ارسال پیام خصوصی برای شما نشدم،روشی که شما استفاده کردید روش ساده تشخیص هویت کاربر به صورت کاملا استاتیک است،یعنی در صورتی که یک صفحه به پروژه شما اضافه شه،هم جدول و هم فرم رو باید تغییر بدید ،ضمنا در بعضی از صفحات کاربر فقط مثلا مجوز دیدن را دارد و یا می تواند ویرایش کند اما نمی تواند حذف کند،که این مهم در روش شما کاملا غیر قابله پیاده سازی است.پیشنهاد میکنم اصلا از این روش در پروژه هاتون استفاده نکنید...
استفاده از 2 جدول یکی برای اطلاعات کاربر و دیگری برای صفحات وی به همراه مجوزهای آن بهترین راه حل است(معمولا)...
بهرحال از پاسخ شما واقعا ممنونم و اگر از دوستان کسی هست که نظره بهتری داره مشتاق هستم که بدونم.

akarsu
یک شنبه 23 خرداد 1389, 23:28 عصر
دوست من بنده به دلیل تعداد ارسال های کم موفق به ارسال پیام خصوصی برای شما نشدم،روشی که شما استفاده کردید روش ساده تشخیص هویت کاربر به صورت کاملا استاتیک است،یعنی در صورتی که یک صفحه به پروژه شما اضافه شه،هم جدول و هم فرم رو باید تغییر بدید ،ضمنا در بعضی از صفحات کاربر فقط مثلا مجوز دیدن را دارد و یا می تواند ویرایش کند اما نمی تواند حذف کند،که این مهم در روش شما کاملا غیر قابله پیاده سازی است.پیشنهاد میکنم اصلا از این روش در پروژه هاتون استفاده نکنید...
استفاده از 2 جدول یکی برای اطلاعات کاربر و دیگری برای صفحات وی به همراه مجوزهای آن بهترین راه حل است(معمولا)...
بهرحال از پاسخ شما واقعا ممنونم و اگر از دوستان کسی هست که نظره بهتری داره مشتاق هستم که بدونم.
من ممنونم كه داري ايرادهايي كه پيش ميادو ميگي كه منم رو حل اونا كار كنم و خودمو پيشرفت بدم .بازم ممنون:لبخندساده:

azam2005
یک شنبه 17 اردیبهشت 1391, 18:21 عصر
با سلام
اگر بخواهید روی سطر های خاص هم مجوز دهید چکار می کنید؟
مثلا اگر بخواهید یک کاربر پس از ورود به سایت امکان ویرایش - مشاهده - حذف و ... رکوردهای خاصی را داشته باشد مثلا :

1-همه رکورد های یک جدول را
2- رکوردهایی که خودش ثبت کرده
3-رکوردهای که پرسنل ثبت کرده
4- رکوردهایی که همکار ثبت کرده و ...

Ir.WebDeveloper
یک شنبه 17 اردیبهشت 1391, 22:32 عصر
اینگونه موارد رو بهتر است با DBMS بر طرف کنید.مثلا برای چنین جداولی کافی است کد کاربر را برای رکوردهایی که ذخیره کرده در یک فیلد نگه دارید و بعد براحتی برای هر کاربر فیلتر را انجام دهید.