PDA

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



bahane274
دوشنبه 08 شهریور 1389, 15:56 عصر
سلام دوستان!
من می خوام واسه یه برنامه ی تحت شبکه سطح دسترسی تعریف کنم به این صورت که مثلا اگه طرف مدیر بود بتونه یه سری کارا مثل تعریف کاربر جدید و... انجام بده.
در ابتدا می خواستم یه متغیر تعریف کنم که با زدن دکمه ورود و نمایش فرم اصلی نام کاربری در اون ذخیره بشه اما اینجوری (تحت شبکه) همیشه نام آخرین نفری که وارد شده در اون قرار میگیره.
از اونجایی که وقت کمی واسه تحویل پروژم دارم لطفا با یه روش آسون و گام به گام بگید چی کار باید بکنم؟

maryam_87
سه شنبه 09 شهریور 1389, 09:00 صبح
برای هر یک از کاربرات یه فرم ایجاد کن که با وارد شدن مدیر فرم مدیر و قابلیتهای اون معلوم باشه
یعنی برای هر یک از سطوح دسترسی یه فرم

bahane274
سه شنبه 09 شهریور 1389, 13:40 عصر
1. من تو پروژم حداقل 10 تا فرم دارم . واسه هر کاربر این 10 تا فرم رو ایجاد کنم؟
2.یکی از کارایی که مدیر میتونه انجام بده ایجاد کاربر جدیده. واسه کاربرایی که جدیدا اضافه میشن چه طوری فرم درست کنم؟
اگه میشه با کدنویسی بگید.

maryam_87
سه شنبه 09 شهریور 1389, 13:47 عصر
1. من تو پروژم حداقل 10 تا فرم دارم . واسه هر کاربر این 10 تا فرم رو ایجاد کنم؟
2.یکی از کارایی که مدیر میتونه انجام بده ایجاد کاربر جدیده. واسه کاربرایی که جدیدا اضافه میشن چه طوری فرم درست کنم؟
اگه میشه با کدنویسی بگید.
توی کابرهات چندتا سطح دسترسی داری؟یعنی بیا برای تک تک کاربرات معلوم کن چنذ مفر می تونن کاربر جدید ایجاد کنن؟چند تا می تونند فلان کار خاص رو انجام بدن؟
رو این تعداد باید فرم درست کنی
روی هر کدوم از فرم ها قابلیت هایی که مد نظرت هستن رو اضافه کن
دوست عزیز خواستی راهنماییت می کنم ولی الان نمی تونم کد بنویسم
سوالی داشتی بازم بپرس

bahane274
سه شنبه 09 شهریور 1389, 13:56 عصر
پروژم سیستم املاک تحت شبکه ست که می خوام فقط مدیر بنگاه بتونه کاربر جدید ایجاد کنه . از طرف دیگه توی یه فرم دیگه دفترچه یادداشت گذاشتم که هر کاربری می تونه یه یادداشت به عنوان یادآوری بزاره که می خوام هر کاربر تعیین کنه که این یادداشت واسه همه نمایش داده بشه یا فقط خودش.
اینکه واسه هر کاربر یه فرم جدا درست کنم گیجم کرد. در ضمن نمی دونم واسه کاربرای جدیدی که اضافه میشن چه جوری فرم درست کنم.

maryam_87
سه شنبه 09 شهریور 1389, 14:03 عصر
پروژم سیستم املاک تحت شبکه ست که می خوام فقط مدیر بنگاه بتونه کاربر جدید ایجاد کنه . از طرف دیگه توی یه فرم دیگه دفترچه یادداشت گذاشتم که هر کاربری می تونه یه یادداشت به عنوان یادآوری بزاره که می خوام هر کاربر تعیین کنه که این یادداشت واسه همه نمایش داده بشه یا فقط خودش.
اینکه واسه هر کاربر یه فرم جدا درست کنم گیجم کرد. در ضمن نمی دونم واسه کاربرای جدیدی که اضافه میشن چه جوری فرم درست کنم.
خوب دو تا فرم احتیاج دارید یکی واسه مدیر یکی واسه بقیه کاربرا
هر کاربر جدید که اضافه میشه باید از فرم نوع دو استفاده کنه

bahane274
سه شنبه 09 شهریور 1389, 14:27 عصر
1.
نمی دونم واسه کاربرای جدیدی که اضافه میشن چه جوری فرم درست کنم.
2. آخه بعلت وجود اون دفترچه یادداشته همین کاربرای نوع 2 هم از هم متفاوت میشن. یعنی این جوری نیست که بگم اگه طرف مدیر بود فرم 1 باز بشه اگه نبود فرم نوع 2. بنابراین دوباره باید تعیین کنم که اگه مدیر نبود ، پس کیه و آیا یادداشت باید بهش نشون داده بشه یا نه ؟
پس باید اسم کاربری شو داشته باشم. درسته؟

maryam_87
سه شنبه 09 شهریور 1389, 14:30 عصر
1.
2. آخه بعلت وجود اون دفترچه یادداشته همین کاربرای نوع 2 هم از هم متفاوت میشن. یعنی این جوری نیست که بگم اگه طرف مدیر بود فرم 1 باز بشه اگه نبود فرم نوع 2. درسته؟
دقیقا همینی که گفتی هست
اگه طرف مدیر بود فرم 1 باز بشه اگه نبود فرم نوع 2
می تونی توی فرم 2 یه ریچ تکس باکس بذاری و به دیتا بیس متصل کنی یا ذخیره کنی یا....

bahane274
سه شنبه 09 شهریور 1389, 14:38 عصر
1.
دوباره باید تعیین کنم که اگه مدیر نبود ، پس کیه و آیا یادداشت باید بهش نشون داده بشه یا نه ؟ پس باید اسم کاربری شو داشته باشم. درسته؟

یه سوال دیگه فرم نوع 2 باید شامل همه اون 10 تا فرم باشه دیگه؟

manij_mhm
سه شنبه 09 شهریور 1389, 14:40 عصر
سلام.
خیلی نیاز نیست پیچیده اش کنید.
فرض کنیم یه button قرار دادی که اگه روش کلیک کنید بتونید یه کاربر جدید ایجادکنید.
اگه از پایگاه برای ذخیره یوزر و پسورد استفاده می کنید یه هم برای فیلد سطح دسترسی بذارید.
تو برنامه چک کنید اگه کاربر دارای سطح کاربری مدیریته پس visibility اون button رو true کنید. اگه نه که false.

موفق باشید.

bahane274
سه شنبه 09 شهریور 1389, 14:43 عصر
این فکر خوبیه. دیگه داشتم قاط میزدم.
واسه دفترچه یادداشته چی کار کنم که می خوام واسه هر کاربر یادداشت جدا نمایش داده بشه؟

maryam_87
سه شنبه 09 شهریور 1389, 14:45 عصر
یه سوال دیگه فرم نوع 2 باید شامل همه اون 10 تا فرم باشه دیگه؟
می تونه یه لینک واسشون بذاری
ولی این راهی هم که دوستومن گفتن میشه فقط واسه برنامه های کوچیک خوبه

bahane274
سه شنبه 09 شهریور 1389, 15:00 عصر
دفترچه یادداشتم به این صورته که فرد یه تاریخ و عنوانی رو تعیین میکنه مثلا" قرار محضر با فلانی " که هر وقت تو اون روز نرم افزار املاک رو باز کرد طی پیغامی این قرار یادآوری میشه.حالا من می خوام موقع ایجاد ،فرد تعیین کنه این یادداشت خصوصی باشه (با توجه به نام کاربری)یا به همه همکارانش نمایش داده بشه.

maryam_87
سه شنبه 09 شهریور 1389, 15:08 عصر
دفترچه یادداشتم به این صورته که فرد یه تاریخ و عنوانی رو تعیین میکنه مثلا" قرار محضر با فلانی " که هر وقت تو اون روز نرم افزار املاک رو باز کرد طی پیغامی این قرار یادآوری میشه.حالا من می خوام موقع ایجاد ،فرد تعیین کنه این یادداشت خصوصی باشه (با توجه به نام کاربری)یا به همه همکارانش نمایش داده بشه.
خب این دیگه از سطح دسترسی و تحت شبکه کردن خارج میشه
خب اگه خصوصی باشه که فقط واسه فرد نمایش داده میشه و اگه عمومی باشه واسه کل کابرها باید broadcast بشه
تاریخ ثبت یادداشت رو با تاریخ روز چک می کنه و بعد این کاری رو که گفتم انجام میده

manij_mhm
سه شنبه 09 شهریور 1389, 15:30 عصر
ولی این راهی هم که دوستومن گفتن میشه فقط واسه برنامه های کوچیک خوبه

یه خورده بی انصافیه اینطوری.
من یه سیستم فایل نوشتم از این روش هم توش استفاده کردم، خوب نتیجه داد.


،فرد تعیین کنه این یادداشت خصوصی باشه (با توجه به نام کاربری)یا به همه همکارانش نمایش داده بشه.
یادداشتهای که قراره عمومی باشه رو می تونید جدا ذخیره کنید.
اونطوری هر کسی که login کرد واسش نمایش داده می شه.
ببینید اینطوری می تونید جواب بگیرید؟

bahane274
سه شنبه 09 شهریور 1389, 16:03 عصر
خب اگه خصوصی باشه که فقط واسه فرد نمایش داده میشه و اگه عمومی باشه واسه کل کابرها باید broadcast بشه

اگه میشه در مورد این broadcast بیشتر توضیح بده.

bahane274
سه شنبه 09 شهریور 1389, 16:09 عصر
یادداشتهای که قراره عمومی باشه رو می تونید جدا ذخیره کنید.
اونطوری هر کسی که login کرد واسش نمایش داده می شه.
ببینید اینطوری می تونید جواب بگیرید؟

با یادداشتهای عمومی مشکلی ندارم میتونم یک فیلد بولین تعریف کنم که واسه عمومی ها یک باشه.
اما یادداشت های خصوصی چی؟
اگه تحت شبکه نبود میگفتیم مثلا آقای رضایی این یادداشت رو واسه خودش گذاشته و حالا که لاگین میکنه بهش نشون میدیم اما تو شبکه در آن واحد چند نفر لاگین کردند ومن نمی دونم چه جوری تو برنامم تشخیص بدم الان این کیه؟؟

bahane274
سه شنبه 09 شهریور 1389, 17:45 عصر
ببینید من یک متغیر Public static تعریف کردم که به محض لاگین شدن اسم کاربری درون اون ریخته میشه و موقع نمایش یادداشتها هم چک میکنم که اگه فیلد user مربوط به یادداشت امروز برابر این متغیره اون رو نمایش بده.(واسه یادداشتهای خصوصی)
حالا سوال من از دوستانی که شبکه کار کردند اینه که وقتی یه user لاگین کرده و بعد از اون یکی دیگه لاگین میکنه ، آیا اسم کاربری آخرین نفر تو این متغیر قرار میگیره یا اینکه مثل تحت وب هر کی یه session داره و مقدار این متغیر سراسری برای هر کاربر تا وقتی که از برنامه خارج بشه حفظ میشه؟

C Sharp
سه شنبه 09 شهریور 1389, 17:49 عصر
چرا کسی نپرسید : منظورتون از تحت شبکه چیه ؟

دیتابیس رو یه سیستم قرار داره و بقیه از سیستم های دیگه با connection string به اون متصل میشن ؟
یا اینکه سیستمتون رو کلاینت سروری نوشتین و سوکت پروگرمینگ کار کردین ؟

اینو به این خاطر پرسیدم چون قضیه این تاپیک شده مثل اون فیلی که تو اتاق تاریک گذاشتن و هرکی میرفت تو به یه جاش دست میزد و یه تصوری میکرد و واسه بقیه تعریف میکرد

در هر صورت ، اگه میخواید فعلا این سیستم کارتون رو راه بندازه و دیدی به آینده و توسعه اش ندارین میتونید از روشی که manij_mhm گفتن استفاده کنی واسه تعیین سطوح دسترسیت

واسه پیغامها هم میتونید یه جدول تو بانک بذارید که توی اون فرسنتده ، گیرنده ، متن ، تاریخ ارسال مشخص باشه .اگه میخواین به شخص خاصی ارسال بشه که نام کاربریش رو تو فیلد گیرنده میذارید و اگه میخواین به دست همه برسه میتونید یه مقدار خاصی رو قرار داد کنید (مثلا 'all') و تو فیلد گیرنده بذارید

وقتی کاربری لاگین کرد ، بر اساس نام کاربریش تو جدول پیغامها سرچ کنید


Select * From Message Where Recipient='Username' or Recipient='all'

چون کاربر هروقت لاگین کنه همه این پیغامها (چه خوانده شده چه نشده ) رو میبینه ، پس :

اگه میخواید سوابق این پیغامها رو داشته باشید ولی نمیخواید همه رو ببینه یه فیلد از نوع bit به اسم IsReaded تو جدول اضافه کنین و فقط اونایی که False هستن رو نشون بدین



Select * From Message Where (Recipient='Username' or Recipient='all' ) and IsReaded = 0


و اگه نمیخواید سوابق رو نگه دارید بعد نمایش از جدول پاکشون کنید

C Sharp
سه شنبه 09 شهریور 1389, 17:58 عصر
سوال من از دوستانی که شبکه کار کردند اینه که وقتی یه user لاگین کرده و بعد از اون یکی دیگه لاگین میکنه ، آیا اسم کاربری آخرین نفر تو این متغیر قرار میگیره یا اینکه مثل تحت وب هر کی یه session داره و مقدار این متغیر سراسری برای هر کاربر تا وقتی که از برنامه خارج بشه حفظ میشه؟

چه برنامه تحت شبکه باشه و چه نباشه ، وقتی نمونه های مجزایی از سیستم اجرا بشه ، هرکدوم حافظه جدایی رو به خودشون تخصیص میدن ، پس نگران این قضیه نباشید

bahane274
سه شنبه 09 شهریور 1389, 22:52 عصر
جناب c sharp مشکل من اون متغیر سراسری ست نه نحوه ارسال پیغام.

شما گفتید که وقتی نمونه های مجزایی از سیستم اجرا بشه ، هرکدوم حافظه جدایی رو به خودشون تخصیص میدن اما من تو همین سیستم خودم هم زمان با دو تا user لاگین کردم و یه دکمه هم روی فرم گذاشتم که مقدار اون متغیر سراسریه رو نشون بده .

وقتی کاربر دوم لاگین شد دیگه نام کاربری user دومم نمایش داده میشد یعنی مقدار اون متغیره عوض شده بود .

نمیدوم اصلا این تست درست بوده یا نه اما اگه تو شبکه هم این جوری باشه دیگه شرطی که نوشتید معنا نداره.



Select * From Message Where Recipient='Username' or Recipient='all'

C Sharp
چهارشنبه 10 شهریور 1389, 01:26 صبح
داخل یه نمونه اجرا شده از سیستم دوبار لاگین کردین ؟
چرا همچین کاری باید انجام بشه ؟
اصولیش اینه که وقتی کسی میخواد با یه ID لاگین بشه ، ID قبلیش از سیستم خارج بشه
بعنوان نمونه میتونید به مسنجرها توجه کنین، شما وقتی میخوای با یه ID دیگه وارد بشی ، باید اول ID قبلی رو Disconnect کنین
چرا راه دور بریم ،تو همین سایت اگه شما دو تا username داشته باشین ، غیر از اینه که اول باید خارج بشید تا بتونید با username دومتون وارد بشین ؟

اگه منظورتون اینه که کاربرای متفاوت تو یه نمونه ازسییتم لاگین کنن که خیلی ایده عجیبیه !
چون در اینصورت اگه فرض کنیم مشکل متغیر سراسری حل بشه ، اونوقت به تعداد کاربراتون به موس و کیبورد و مانیتور نیاز دارین :قهقهه:

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

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

arian_sh3
چهارشنبه 10 شهریور 1389, 11:37 صبح
دوست عزیز به نظر میاد شما سعی دارید کاری مثل کار کوکی ها تو وب بکنید. خوب در این صورت مشخص هست که نمیتونید دوتا یوزر رو از یک جا online کنید. مگر اینکه هر کس اومد یک کوکی به اسم خودش ایجاد بشه و همینطور خونده بشه که منطقی نیست. اما شدنی هست.
برای اینکار منم سیستم دیتا بیس رو پیشنهاد میکنم چون کلا خیلی کارو ساده و کوتاه میکنه...

bahane274
چهارشنبه 10 شهریور 1389, 12:27 عصر
1) من قراره دیتابیسمو رو یه سیستم بریزم و بقیه با connection string به اون وصل بشن.
2) قرار نیست از یه سیستم دو تا یوسر بتونن login کنن علت کاری که کردم این بود که تست کنم ببینم آیا همون طور که شما جناب Csharp گفتین در حالت غیر شبکه برای هر کاربر مقدار متغیر سراسریه متفاوته یا نه.
3) قراره هر کی login کرد username اش تو یه متغیر سراسری ریخته میشه تا تو فرمهای دیگم اطلاعات همون شخصو نشون بدم.(یادداشتهایی که هر کی به عنوان یادآوری واسه خودش گذاشته)
مشکلی که من داشتم این بود که میخواستم بدونم چون متغیر سراسریه اگه یه کاربر دیگه از یه سیستم دیگه login کنه مقدار متغیر سراسری ، Usename ِ اون میشه و از این به بعد تو فرم تمام کاربران ِ On اطلاعات اون شخص تازه وارد نمایش داده میشه یا هر یوسر متغیر سراسریش مخصوص خودشه و هیچکس نمیتونه به خاطر سراسری بودن متغیر ، مقدار اونو تغییر بده.
با فرض اینکه حرف شما دوستان عزیزم درسته و هیچ مشکلی پیش نمیاد ، از شما بزرگوارا یه سوال دیگه داشتم : استفاده از متغیر سراسری واسه حفظ یوسر کاربر جهت استفاده در فرمای دیگه روش درستیه ؟در Win App یه چیزی مثل Session یا به قول دوستمون کوکی در وب وجود نداره که با اون بتونم تو هر فرمم بدونم این فرمو کی login کرده و نیازی نباشه متغیر سراسریه رو از این فرم به اون فرم پاس بدم؟
با تشکر و سپاس

C Sharp
چهارشنبه 10 شهریور 1389, 13:27 عصر
اگه توی کلاس Program (یا هر کلاس دیگه ای ) یه Property استاتیک تعریف کنید ، میتونید از هرجایی تو برنامه تون ازش استفاده کنین



static class Program
{
private static User _user;
public static User User
{
get { return _user; }
}
[STAThread]
static void Main()
{
Authenticator authenticator = new Authenticator();
LoginForm login = new LoginForm(authenticator);
if (login.ShowDialog() != DialogResult.OK)
return;
_user = authenticator.User;
Application.Run(new MainForm());
}
}





public struct User
{
private string _username;
private string _fullName;
public string Username
{
get { return _username; }
}
public string FullName
{
get { return _fullName; }
}
public User(string username, string fullName)
{
_username = username;
_fullName = fullName;
}
}





...
labelUsername.Text = Program.User.Username;
...

bahane274
چهارشنبه 10 شهریور 1389, 15:52 عصر
1.اگه میشه هر کدام از خطوط داخل تابع Main رو توضیح بدید.
2. اگه تونستید همینو برام به صورت یه sample بزارید.:خجالت: