PDA

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



crazy_1892
پنج شنبه 22 مرداد 1388, 09:47 صبح
سلام دوستان
قبل از هر چیز از دوستانی که به سوالات من جواب میدم واقعا تشکر می کنم
دوستان من می خوام تو برنامه ای که نوشتم برای کاربرانی که از برنامه استفاده می کنند سطح دسترسی تعریف کنم که همه user ها به همه منوها دسترسی نداشته باشند،من خیلی تاپیکهارو نگاه کردم ولی چیز واضح و روشنی پیدا نکردم:گریه::گریه::گریه:

happy65_sh
پنج شنبه 22 مرداد 1388, 10:13 صبح
اول از همه نیاز هست که اطلاعات مربوط به سطح دسترسی و کدکاربرانت را در یک جدول در دیتابیست ذخیره کنی (مثلا یک جدول به اسم دسترسی که در اون کد کاربر و کد منوها به عنوان دو فیلد وجود داره)
حالا برای اینکه توی برنامه ات بتونی سطوح دسترسی راپیاده کنی یک کلاس بنویس مثلا find توی کلاست کد منوهایی که کاربر وارد شده بهش دسترسی دارد را بازیابی کن(با یک دستور Select ساده)ودر لود فرم اصلیت براساس منوهای انتخاب شده Enable ها یا Visible ها را True و False کن.البته میتونی به جز منو روی اعمالی که توی برنامه ات انجام می شه هم محدو دیت بذاری مثلا یکی از کاربران اصلا اجازه حذف نداشته باشه که با همین روش قابل پیاده سازی هست فقط باید اعمالت را هم در یک جدول جداگانه ذخیره کنی و در هنگامی که کاربری قصد اجرای اون عمل را داره اول چک کنی آیا اجازه انجام اون عمل را داره یا نه؟

Saeed.Masoumi
پنج شنبه 22 مرداد 1388, 14:32 عصر
using System.Security.Permissions;
using System.Security.Principal;
using System.Threading;



private void Form1_Load(object sender, EventArgs e)
{
AppDomain.CurrentDomain.SetPrincipalPolicy(Princip alPolicy.WindowsPrincipal);
WindowsPrincipal principal = (WindowsPrincipal)Thread.CurrentPrincipal;
WindowsIdentity identity = (WindowsIdentity)principal.Identity;
if (principal.IsInRole(WindowsBuiltInRole.User))
{
if (principal.IsInRole(WindowsBuiltInRole.Administrat or))
Do_Administrator();
if (principal.IsInRole(WindowsBuiltInRole.Guest))
Do_Guest();
if(principal.IsInRole(WindowsBuiltInRole.AccountOp erator)
Do_AccountOperator();
if(principal.IsInRole(WindowsBuiltInRole.BackupOpe rator)
Do_BackupOperator();
if(principal.IsInRole(WindowsBuiltInRole.PowerUser )
Do_PowerUser();
if(principal.IsInRole(WindowsBuiltInRole.PrintOper ator)
Do_PrintOperator();
if(principal.IsInRole(WindowsBuiltInRole.Replicato r)
Do_Replicator();
if(principal.IsInRole(WindowsBuiltInRole.SystemOpe rator)
Do_SystemOperator();
}
}

sd.CSharpProgrammer
پنج شنبه 22 مرداد 1388, 18:06 عصر
سلام

من براي تعيين سطوح دسترسي اينكار رو انجام ميدم :
يك جدول ميسازم كه شامل فيلد id اشخاصه و همچنين براي هر منو يك فيلد از نوع true/false ميگذارم. براي هر كاربري كه تو برنامه ثبت ميشه يك ركورد تو اين جدول اضافه ميشه كه شامل id اونه و براي هر منوي فعال كاربر مقدارش رو تو جدول true و براي منوهاي غير فعال false ميگذارم.
موقعي كه كاربر ميخواد وارد برنامه بشه ميرم سراغ اون جدول و با توجه به id اون كاربر منوهاي لازم رو فعال و بقيه رو غير فعال ميكنم.
البته به نظر من اگه منويي تو تمام مدت براي يه كاربر بايد غيرفعال باشه دليلي براي visible بودنش نيست! پس بجاي فعال/غير فعال كردن منوها رو مخفي ميكنم (visible = false).

موفق باشي

m.mahnani
پنج شنبه 22 مرداد 1388, 20:58 عصر
با سلام خدمت دوستان عزیز ؛
دوستان اگه بتونید یه نمونه برنامه برای دانلود بگذارید خیلی عالی میشه
ممنون.

raha_20
پنج شنبه 22 مرداد 1388, 21:51 عصر
خواهشا اگه کسی برنامه ای در این مورد داره دانلود کنه . خیلی ها به این موضوع نیاز دارند.

Atena_k
پنج شنبه 22 مرداد 1388, 22:08 عصر
سلام
در نسخه 3.5 دات نت فریم وزک امکان جدیدی به نام Client Application Services وجود دارد که به همین مقوله می پردازد.
توضیحات بیشتر را می توانید در لینک زیر مشاهده کنید.پیشنهاد می کنم حتما مطالعه کنید:

Client Application Services Overview (http://msdn.microsoft.com/en-us/library/bb384339.aspx)

raha_20
پنج شنبه 22 مرداد 1388, 22:22 عصر
using System.Security.Permissions;



using System.Security.Principal;

using System.Threading;







private void Form1_Load(object sender, EventArgs e)




{

AppDomain.CurrentDomain.SetPrincipalPolicy(Princip alPolicy.WindowsPrincipal);
WindowsPrincipal principal = (WindowsPrincipal)Thread.CurrentPrincipal;
WindowsIdentity identity = (WindowsIdentity)principal.Identity;
if (principal.IsInRole(WindowsBuiltInRole.User))
{
if (principal.IsInRole(WindowsBuiltInRole.Administrat or))
Do_Administrator();
if (principal.IsInRole(WindowsBuiltInRole.Guest))
Do_Guest();
if(principal.IsInRole(WindowsBuiltInRole.AccountOp erator)
Do_AccountOperator();
if(principal.IsInRole(WindowsBuiltInRole.BackupOpe rator)
Do_BackupOperator();
if(principal.IsInRole(WindowsBuiltInRole.PowerUser )
Do_PowerUser();
if(principal.IsInRole(WindowsBuiltInRole.PrintOper ator)
Do_PrintOperator();
if(principal.IsInRole(WindowsBuiltInRole.Replicato r)
Do_Replicator();
if(principal.IsInRole(WindowsBuiltInRole.SystemOpe rator)
Do_SystemOperator();
}

}








میشه یه کم در مورد این کدی که گذاشتین توضیح بدین

meysam_pro
پنج شنبه 22 مرداد 1388, 22:35 عصر
سلام

من براي تعيين سطوح دسترسي اينكار رو انجام ميدم :
يك جدول ميسازم كه شامل فيلد id اشخاصه و همچنين براي هر منو يك فيلد از نوع true/false ميگذارم. براي هر كاربري كه تو برنامه ثبت ميشه يك ركورد تو اين جدول اضافه ميشه كه شامل id اونه و براي هر منوي فعال كاربر مقدارش رو تو جدول true و براي منوهاي غير فعال false ميگذارم.
موقعي كه كاربر ميخواد وارد برنامه بشه ميرم سراغ اون جدول و با توجه به id اون كاربر منوهاي لازم رو فعال و بقيه رو غير فعال ميكنم.
البته به نظر من اگه منويي تو تمام مدت براي يه كاربر بايد غيرفعال باشه دليلي براي visible بودنش نيست! پس بجاي فعال/غير فعال كردن منوها رو مخفي ميكنم (visible = false).

موفق باشي

این روشی که دوست خوبمون گفتن خوبه، در حالتی که برنامه مون زیاد بزرگ نباشه.(در این مورد یه بحث مفصلی شده که لینکش تو امضای آقای مداح هست).

در مورد Role Based security سرچ بکنید نمونه پیدا میشه( تو Training Kit Visual Studio 2008 تو سایت MSDN هم یه مثال خوب هست)

raha_20
پنج شنبه 22 مرداد 1388, 22:48 عصر
خواهشا یه منبع فارسی معرفی کنید در این مورد .

اگه کسی برنامه هرچند خیلی ساده هم داره بزاره یا اگه جایی هست لینکش را بزارین . من خیلی احتیاج دارم .

saymon
پنج شنبه 22 مرداد 1388, 22:52 عصر
سلام دوستان
قبل از هر چیز از دوستانی که به سوالات من جواب میدم واقعا تشکر می کنم
دوستان من می خوام تو برنامه ای که نوشتم برای کاربرانی که از برنامه استفاده می کنند سطح دسترسی تعریف کنم که همه user ها به همه منوها دسترسی نداشته باشند،من خیلی تاپیکهارو نگاه کردم ولی چیز واضح و روشنی پیدا نکردم:گریه::گریه::گریه:
من یه چنین چیزی نوشتم امید وارم به دردت بخوره. اول که یه فرم برای Loginبساز که توش userوpasslمی گیره بعد میره توDATABASEوبا توجه به این که مثلا Adminیا چیز دیگه( که موقع ثبت نام این تعیین می شه) دسترسی را تعیین می کنه اینم کدش این باAccess نوشته شده:


OleDbConnection cn = new OleDbConnection();
cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Documents and Settings\\saymon\\My Documents\\MyDB.mdb;";
OleDbCommand cmdlogin = new OleDbCommand();
cmdlogin.Connection = cn;
cmdlogin.CommandText = "SELECT AccessLevel FROM UserAcount WHERE UsrName = '" + txtuser.Text
+ "'AND Passwd = '" + txtpass.Text + "'";
int q;
cn.Open();
q = Convert.ToInt32(cmdlogin.ExecuteScalar());
cn.Close();
if (q == 0)
{

lblmessage.Text = "Invalid User Name or Password!";
lblmessage.Visible = true;

}
else
{
frmmain f = new frmmain(q);
f.Show();
this.Visible = false;
}
}

saymon
پنج شنبه 22 مرداد 1388, 23:16 عصر
من یه چنین چیزی نوشتم امید وارم به دردت بخوره. اول که یه فرم برای Loginبساز که توش userوpasslمی گیره بعد میره توDATABASEوبا توجه به این که مثلا Adminیا چیز دیگه( که موقع ثبت نام این تعیین می شه) دسترسی را تعیین می کنه اینم کدش این باAccess نوشته شده:


OleDbConnection cn = new OleDbConnection();
cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Documents and Settings\\saymon\\My Documents\\MyDB.mdb;";
OleDbCommand cmdlogin = new OleDbCommand();
cmdlogin.Connection = cn;
cmdlogin.CommandText = "SELECT AccessLevel FROM UserAcount WHERE UsrName = '" + txtuser.Text
+ "'AND Passwd = '" + txtpass.Text + "'";
int q;
cn.Open();
q = Convert.ToInt32(cmdlogin.ExecuteScalar());
cn.Close();
if (q == 0)
{

lblmessage.Text = "Invalid User Name or Password!";
lblmessage.Visible = true;

}
else
{
frmmain f = new frmmain(q);
f.Show();
this.Visible = false;
}
}

راستی منظور از qای که نوشتم برای حالت های مختلف کاربر که Adminو..است نوشته شده که در constructorفرم مین تغییرات مربوط به منو ها انجام می شود :مثلا یه چنین کاری:
public frmmain(int Accesslevel)
{
InitializeComponent();
if (Accesslevel == 2)
{
btnuserManagment.Enabled= false;
}
}

raha_20
پنج شنبه 22 مرداد 1388, 23:48 عصر
اگه میتونی برنامه رو کامل اینجا آپلود کن. من خیلی مشتاق یه چنین برنامه هایی هستم

Saeed.Masoumi
جمعه 23 مرداد 1388, 00:10 صبح
میشه یه کم در مورد این کدی که گذاشتین توضیح بدین
شرمنده من فکر کردم که ایشون می خواهد براساس کاربران ویندوز سطح دسترسی را تعریف کند
لذا در ان کد تست کردم که کاربر جاری ویندوز از چه نوع کاربرانی است سپس بنا به نوع آنها یک تابع را صدا زدم که داخل تابع Show , Hide , Enable , Visible ها را تعریف کردم
از همه به خاطر اشتباهم عذر می خواهم :اشتباه:

raha_20
جمعه 23 مرداد 1388, 09:57 صبح
ایا من باید برای تمام Object هایی که روی فرم میزارم یه فیلد توی دیتا بیسم اضافه کنم مشخص کنم که کاربر چه نوع دسترسی به این آبجکت داره

sd.CSharpProgrammer
جمعه 23 مرداد 1388, 11:29 صبح
ایا من باید برای تمام Object هایی که روی فرم میزارم یه فیلد توی دیتا بیسم اضافه کنم مشخص کنم که کاربر چه نوع دسترسی به این آبجکت داره

مگه ميخواي واسه تك تك آبجكتاي برنامه ات سطوح دسترسي تعريف كني؟؟؟ :متعجب::متعجب::متعجب:

raha_20
جمعه 23 مرداد 1388, 12:03 عصر
خوب پس باید واسه چیا سطوح دسترسی تعیی کنیم

m.mahnani
جمعه 23 مرداد 1388, 18:53 عصر
سلامی دوباره
آقا یعنی یه جوانمرد پیدا نمیشه برای راهنمایی بقیه یه برنامه برای دانلود کردن بذاره :عصبانی++:

happy65_sh
شنبه 24 مرداد 1388, 07:53 صبح
سلام

خوب پس باید واسه چیا سطوح دسترسی تعیی کنیم
میتونی واسه هر چی که دوست داری سطح دسترسی تعریف کنی حتی برای تک تک عملیات هات ولی خوب مطمئنا هرچی برنامه بزرگتر بشه کارت سخت تر و بیشتر می شه اما این خودت هستی که تعیین می کنی تا چه سطحی در برنامه ات سطوح دسترسی تعریف بشه.

دوست عزیز این یک نمونه ی بسیار ساده هست.فقط چند تا نکته:
یادت نره بانکت را اول Attach کنی.
برای ورود رمز عبور و نام عبور را 0 و 0 یا 1 و 1 یا 2 و2 بده البته خودت می تونی وارد جداولت بشی و مقاذیر فرضی بیشتری را برای تست کردن وارد کنی.(به صورت دستی)

raha_20
شنبه 24 مرداد 1388, 10:40 صبح
مرسی از اینکه برنامه واسم گذاشتین . ممنون

raha_20
شنبه 24 مرداد 1388, 11:19 صبح
TestDastresy.Properties.Settings.Default.codekarba r

raha_20
شنبه 24 مرداد 1388, 11:21 صبح
میشه یه کم در مورد این کد توضیح بدین . من نمیدونم چی کار میکنه و اصلا اینکه Codekarbar چی هست .

happy65_sh
شنبه 24 مرداد 1388, 12:46 عصر
روی برنامه از قسمت Solution کلیک راست کن properties راانتخاب کن بعد از سمت راست صفحه باز شده setting را انتخاب کن میتونی متغیر codekarbar را در اونجا ببینی که تعریف شده تا در کل برنامه بهش دسترسی داشته باشی

raha_20
شنبه 24 مرداد 1388, 15:09 عصر
خوب اونجا دیدم ولی این متغیر چی هیت و چه اطلاعاتی را درخودش نگهداری میکنه

raha_20
یک شنبه 25 مرداد 1388, 00:08 صبح
TestDastresy.Properties.Settings.Default.codekarba r


بچه ها این کد چیه و چه چیزی را بر می گردانه . خروجی آن چیه ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

happy65_sh
یک شنبه 25 مرداد 1388, 06:54 صبح
دوست عزیز codekarbar یک متغیر هست که توی setting تعریف شده تا در کل برنامه بهش دسترسی وجود داشته باشه.چون وقتی توی فرم اول یوزر و پسوورد را می دادی توی فرم دوم نیاز بود بدونیم کدوم کاربر وارد شده تا بر اساس کاربر وارد شده منو را تنظیم کنیم به همین خاطر کد کاربر توی codekarbar ذخیره می شه


TestDastresy.Properties.Settings.Default.codekarba r = int.Parse(dr[0].ToString())

وتوی فرم main بر اساس کد کاربری که در codekarbar ذخیره شده منوی برنامه چیده شده..


SqlCommand com = new SqlCommand("select mid from sdastresy where kid=" + TestDastresy.Properties.Settings.Default.codekarba r

تو به هر شکل دیگه ای که می تونی متغیر سراسری تعریف کن تا توی کل برنامه بهش دسترسی داشته باشی و ازش استفاده کن

poudineh
یک شنبه 25 مرداد 1388, 10:22 صبح
TestDastresy.Properties.Settings.Default.codekarba r




نمیشه. این فقط خواندنی

باید یک کلاس تعریف کنید

M.YasPro
یک شنبه 25 مرداد 1388, 10:51 صبح
من از این روش استفاده میکنم :
یه جدول توی دیتابیسم دارم که کاربر هارو توش تعریف می کنم . فیلدهاش شامل نام کاربری و رمز عبور , id , بقیه فیلد ها هم بستگی به چیزهایی داره که میخوام سطح دسترسی روشون اعمال بشه (مثلا برای حراست یه جایی یه نرم افزار نوشتم که از نظر کارفرما و مسائل امنیتی، مشخصات همسر پرسنل فرقی با آدرس و تلفن هاش نداشت پس این چند تا فیلد رو که شامل مشخصات همسر و آدرس ها و تلفن ها می شد توی جدول users یه فیلد در نظر گرفتم)
وقتی کاربر از فرم لاگین وارد میشد یه DataRow رو با استفاده از فیلد های یوزری که وارد شده مقدار دهی می کردم ، بعد از این هر وقت کاربر فرم جدیدی رو باز می کرد اون DataRow رو به فرم مورد نظر می دادم تا سطح دسترسی ها رو روش اعمال کنه(توی Form_Load).
برای من که این روش خیلی به صرفه بود چون هم خودم ساخته بودمش یعنی هیچ Refrence اضافی یا Componnent یا هر چیز دیگه بیرون از کد خودم نمی خواست هم اینکه فقط یه بار لازم بود اطلاعات یوزر رو از DB بخونی پس کاراییش برای من خیلی بالا بود.
اگر متوجه عرائض نشدید بفرمایید تا دقیق تر توضیح بدم .

happy65_sh
یک شنبه 25 مرداد 1388, 11:49 صبح
نمیشه. این فقط خواندنی
اگر فقط خواندنی بود که نمیشد این کد را نوشت:

TestDastresy.Properties.Settings.Default.codekarba r = int.Parse(dr[0].ToString())

Yasersadegh
یک شنبه 25 مرداد 1388, 12:01 عصر
سلام به همه ي دوستان
اينم يه برنامه تستيه كه تنها جهت يادگيري همين موضوع نوشتم!! كه با بانك اكسس كار ميكنه!!

اگر توضيح لازم بود بفرماييد!!:چشمک:

user68
چهارشنبه 25 آذر 1388, 22:07 عصر
با سلام
من میخوام یه برنامه بنویسم که مثلا مدیر کتابخونه یه سری مجوز برای یه سری کارا داشته باشه وبتونه مسئول کتابخونه رو ثبت کنه و ... خوب یوزر و پسورد این مدیر رو کی تعیین میکنه چون برای ورود به برنامه حتما باید یوزر و پسورد داشته باشیم؟ وایا مدیر باید یوزر و پسورد مسئول رو تعیین کنه؟
با تشکر

c#_programmer
یک شنبه 13 دی 1388, 16:40 عصر
تو sql کاربر جدید بساز و براش مجوزهای لازم رو بده...

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

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

r0ot$harp
یک شنبه 17 اردیبهشت 1391, 19:00 عصر
سلام دوستان عزیز.

راه های بسیاری رو دوستان معرفی کردند.

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

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

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

منظور من از پروژه های تجاری بزرگ کانال ارتباطی با 2000 تا 3000 کاربر فعال هست.

باتشکر احسان