PDA

View Full Version : کنترل کاربران سیستم



mohammad2407
جمعه 04 اسفند 1391, 00:56 صبح
سلام دوستان عزیز من یک برنامه دارم مینویسم الان دارم روی قسمت کاربران کار میکنم

من میخوام سه نوع دسترسی داشته باشم 1- مدیر سیستم ( بالاترین دسترسی) 2- مدیر ( بالاترین دسترسی) 3-کاربر ( دسترسی محدود )

ولی نمیدونم چطوری باید عمل کنم الان من کاربر میسازم و لوگین میکنم به برنامه یعنی هیچ مشکلی با ورود ندارم

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

میشه در مورد دسترسی برام توضیح و مثال بزنید


فرم من دارای فیلد های نام و نام خانوادگی نام کاربری ، رمز نوع دستری هست ( دسترسی ها ذکر شده )
دسترسی با comboBox مشخص میشه

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

f.beigirad
جمعه 04 اسفند 1391, 01:48 صبح
میشه بیشتر توضیح بدین؟


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

جمله بالا یعنی چی؟

mohammad2407
جمعه 04 اسفند 1391, 01:58 صبح
الان تا برنامه اجرا میشه از من یوزر و رمز میخواد و من وارد میکنم و اگر درست بود صفحه اصلی نرم افزار به من نشون میده

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

مثلا اگر مدیر بود یک سری دسترسی ها داشته باشه یک سری هم نداشته باشه

f.beigirad
جمعه 04 اسفند 1391, 02:04 صبح
من تو مورد مشابه شما اومدم آیدی کاربری ک وارد شد رو میفرستادم به فرم اصلی برنامم.

از فرم اصلیمم چک میکردم آیا مدیره یا کاربره.

به همین سادگی.

mohammad2407
جمعه 04 اسفند 1391, 02:17 صبح
میشه با کد مثال بزنید

f.beigirad
جمعه 04 اسفند 1391, 02:42 صبح
دوست عزیز اگر دوستان دیگری براتون کد رو نذاشتن تا فردا ظهر خودم براتون کد رو میذارم.
الان پای سیستم نیستم

mohammad2407
جمعه 04 اسفند 1391, 02:46 صبح
باشه ممنون من الان با کد زیر چک میکنم کاربر وجود داره یا نه ؟ اگر وجود داشت که وارد میشه اگر نه پیام


Form1 frm1 = new Form1();
string user = txtuser.Text;
string pass = txtpass.Text;
var db = new usersDataContext();
var q = db.users.Where(c => c.username == user && c.password == pass);
if (q.Count() != 0)
{
frm1.Show();
this.Hide();

}
else
{
PMessageBox.Show("نام کاربری یا کلمه عبور اشتباه است", "پیام سیستم | ورود ناموفق", PMessageBoxIcons.Warning, 2);
}

mohammad2407
جمعه 04 اسفند 1391, 14:32 عصر
میشه یکی کمک کنه تا اینجا پست اسپم دادیم به نتیجه هم نرسیدیم

f.beigirad
جمعه 04 اسفند 1391, 21:12 عصر
با سلام دوست من.

امیدوارم حالت خوب باشه.ببخشید ک امروز نتونستم بفرستم.


var q = db.Users.Where(c => c.UserName == us && c.PassWord == pw);
if (q.Count() != 0)
{
var UserId = (from p1 in db.Users
where p1.UserName == us
select p1.UID).FirstOrDefault();
new Form1(UserId).ShowDialog(this);
this.Hide()
}
else
{
MessageBox.Show("Error");
}

دوست من خط 7 همونطور ک معلومه آیدی کاربر وارد شده رو به فرم بعدی ازسال میکنه.

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

int userId;
public Form1(int a)
{
InitializeComponent();
userId=a;

}
private void Form1_Load(object sender, EventArgs e)
{
string a=new DataBaseEntities1().Users.FirstOrDefault(p => p.UID == userId).UserName.ToString();
MessageBox.Show(a);

}
من در اینجا UserNameکاربر رو نمایش دادم.
ولی شما همه کار میتونید انجام بدید.مهم اینه که آیدی کاربر به فرم بعدی ارسال میشه.

اگر توضیحاتم ابتدایی بود به بزرگی خودتون ببخشید .من در همین حد بلد بودم

موفق باشید//

f.beigirad
یک شنبه 06 اسفند 1391, 03:04 صبح
با سلام دوست من.
خوب کاری کردی پیام شخصی دادی.چون زیاد ب سایت سر نمیزنم.

تو پست قبلی من دوتا متغیر a دارم.)میدونم کارم درست نبوده ولی .....(
حال میخوام بدونم منظور شما از a کدومه ?
اون ک از فرم لاگین میاد یا رشته ای ک تعریف کردم ?

mohammad2407
یک شنبه 06 اسفند 1391, 09:08 صبح
نه اونی که در فرم قرار میگیره ؟ به فرم لوگین کاری نداریم


int userId;
public Form1(int a)
{
InitializeComponent();
userId=a;

}
private void Form1_Load(object sender, EventArgs e)
{
string a=new DataBaseEntities1().Users.FirstOrDefault(p => p.UID == userId).UserName.ToString();
MessageBox.Show(a);

}

f.beigirad
یک شنبه 06 اسفند 1391, 09:54 صبح
سلام
تو میتونی این متغیر رو به صورت globalتعریف کنی.
و تو رویداد فرم لود فقط این متغیر رو مقدار دهی کنی.
و به این صورت میتونی تو سراسر فرمت از این متغیر استفاده کنی.

موفق باشی///

mohammad2407
دوشنبه 07 اسفند 1391, 01:34 صبح
من الان هر کاری که میکنم نمیتونم از این کد ها در فرم های دیگه استفاده کنم مثلا من از طریق menuStrip وارد یک فرم میشم وبعد وارد فرم دیگری میشم کد که قرار میدم موقعی که برنامه رو اجرا میکنم و به اون فرم میرم خطا میگیره

ولی در فرم اول مشکلی نداره

f.beigirad
دوشنبه 07 اسفند 1391, 11:40 صبح
با درود:

طبق کدی که در پست 9 ارائه دادم.متغیر userId به صورتی تعریف شده ک شما میتونید از اون در Form1 استفاده کنید.

حال شما میتونید همین متغیر رو به فرمای مختلف ارسال کنید.

new Form2(UserId).ShowDialog(this);
this.Hide();

و در فرم 2 هم به این صورت این متغیر رو دریافت کنید:

int userId2;
public Form2(int a)
{
InitializeComponent();
userId2=a;

}
و در نهایت باید بگم که متغیر userId2 همون آیدی که شما برای هر کاری میتونید ازش استفاده کنید.


موفق باشید///

Yanehsar
دوشنبه 07 اسفند 1391, 12:48 عصر
سلام
معمولا سطوح دسترسی به برنامه رو داخل بانک اطلاعاتی تعریف می کنن .
چند تا روش هم داره یکی اینکه بیاید چندتا فیلد تعریف کنی از نوع Bit(اگر SQl استفاده و اگر Access هستش YES/No)که هر کدوم از این فیلد ها یکی از منوهای برنامه هستند اگر Yes یا 1 بود دسترسی داره به اون گزینه اگر هم NO یا 0 بود دسترسی نداره.
روش دوم استفاده از یک متغیر هستش از نوع استرینگ که داخل این متغیر فقط صفر و یک قرار می گیره که داخل برنامه این متغیر را Split می کنید و با توجه به رشته به دست آمده خاصیت Enable منوها و... رو True , False می کنید
یه روش دیگه هم اینکه داخل بانک ذخیره کنی مدیر،کاربر و هر چند نوع سطح دسترسی و با توجه به اون کار سطوح رو دسترسی رو تعیین کنی.

mohammad2407
دوشنبه 07 اسفند 1391, 14:53 عصر
میشه در مورد روش اول بیشتر توضیح بدید و مثال بزنید که به چه شکل هست ؟؟؟ چون به نظر میرسه روش خوبی باشه اگر یک نمونه برنامه بدید که خیلی خوب میشه

از sql server2008 استفاده میکنم


چند تا روش هم داره یکی اینکه بیاید چندتا فیلد تعریف کنی از نوع Bit(اگر SQl استفاده و اگر Access هستش YES/No)که هر کدوم از این فیلد ها یکی از منوهای برنامه هستند اگر Yes یا 1 بود دسترسی داره به اون گزینه اگر هم NO یا 0 بود دسترسی نداره.

mohammad2407
دوشنبه 07 اسفند 1391, 22:59 عصر
دوستان عزیز میشه برام روش زیر شرح بدید


چند تا روش هم داره یکی اینکه بیاید چندتا فیلد تعریف کنی از نوع Bit(اگر SQl استفاده و اگر Access هستش YES/No)که هر کدوم از این فیلد ها یکی از منوهای برنامه هستند اگر Yes یا 1 بود دسترسی داره به اون گزینه اگر هم NO یا 0 بود دسترسی نداره.

f.beigirad
سه شنبه 08 اسفند 1391, 02:07 صبح
با عرض سلام و درود فراوا
دوست من , منظور آقای Yanehsar اینه که باید توی جدول دیتابیست یه ستون هم برای تعیین سطح دسترسی کاربرهات مشخص کنی.
مثلا نوع اون ستون رو میتونی int قرار بدی.و برای مدیر سیستم عدد صفر ,برای مدیر عدد یک و برای کاربر معمولی عدد دو رو قرار بدی.
و وقتی کاربر میخواد لاگین شه باید بعد از اینکه اعتبار پسورد و یوزرنیم تایید شد فیلد مخصوص مشخص کننده سطح دسترسی کاربر چک بشه و اگر صفر بود همه کاری میتونه انجام بده.اگر یک بود یکسزی محدودیت لحاظ شه.اگرم ۲ بود محدودیت های تعریف شده برای کاربر معمولی لحاظ شه.


کامیاب باشی..

mohammad2407
سه شنبه 08 اسفند 1391, 02:15 صبح
قسمت زیر به چه شکل میشه یعنی با چه الگوریتمی باید این عداد با فرم ها و... ست بشن و چک بشن


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

f.beigirad
سه شنبه 08 اسفند 1391, 02:27 صبح
اگر یادتون باشه توی کدهایی ک ارایه دادم , تو کدهای فرم دوم ک یوزرنیم کاربر رو توی مسیج باکس نشون میدادیم؟!!

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

ناگفته نمونه محدودیت هر کاری میتونه باشه.

موفق باشید

mohammad2407
سه شنبه 08 اسفند 1391, 02:39 صبح
دوست عزیز این چیزی که شما داری میگی با روشی که Yanehsar داد خیلی فرق داره

این روشی که شما دارین میگین یه جور هایی همون روش اول هست

باید صبر کرد تا خوده Yanehsar عزیز بیاد توضیح بده

از شما هم ممنونم

Yanehsar
چهارشنبه 09 اسفند 1391, 10:29 صبح
دوستان عزیز میشه برام روش زیر شرح بدید
سلام
اول بانک اطلاعاتی رو هر جور که دوست داری (براساس الگوریتم که دارای طراحی می کنی)و از این روش استفاده می کنم مثله عکس ضمینه
100615
در این بانک من چندتا کار اصلی که معمولا داخل برنامه ها انجام میشه رو آوردم مثلا اضافه کرردن ، ویرایش کردن ، حذف کردن ، گزارش گرفتن و تنظیمات پس شما بانک اطلاعاتی خودتون براساس نیازتون طراحی کنید.
خب حالا داخل فرم لوگین برنامه چک می کنی چننین کاربری با این نام کاربری و پسورد وجود داره یا نه.اگر نداشت که پیام خطا نمایش می دهید اما اگر نام کاربری و کلمه عبور درست بود این کار رو انجام میدید که :


da.Fill(ds,"users");
dv.Table=ds.Tables["users"];
mokhatabin = Convert.ToByte(dv[0]["uname"]);
search = Convert.ToByte(dv[0]["unew"]);
paye = Convert.ToByte(dv[0]["uedit"]);
report = Convert.ToByte(dv[0]["udelete"]);
seting = Convert.ToByte(dv[0]["seting"]);
edit = Convert.ToByte(dv[0]["report"]);


mokhatabin ، search ،report ،seting و... چند تا متغیر هستند که داخل برنامه به صورت عمومی تعریف می کنید و ازشون استفاده می کنید از نوع bool هستند که مقدار true یا false می گیره
در نهایت هم خاصیت Enabled دکمه ها یا منو ها رو تغییر میدید که اینجا من از منو استفاده کردم.


payehToolStripMenuItem.Enabled = Convert.ToBoolean(paye);
reportToolStripMenuItem.Enabled = Convert.ToBoolean(report);
setingToolStripMenuItem.Enabled = Convert.ToBoolean(seting);
searchToolStripMenuItem.Enabled = Convert.ToBoolean(search);

موافق باشید

mohammad2407
چهارشنبه 09 اسفند 1391, 12:22 عصر
فرم ساخت کاربر من به صورت زیر هست ؟ یعنی با چک باکس مشخص میشه به چه قسمت هایی دسترسی داره ؟ الان باید چک باکس ها چه مقداری به اون فیلد هایی که ساختیم بفرسته ؟؟؟؟؟

مثلا : چک باکس ویرایش چه ارسال که به فیلد ؟ چک باکس حذف و یا ... چی باید ارسال کنن

http://up.vbiran.ir/uploads/136195875329866_0Untitled.png
من با کد زیر کاربر چک میکنم از بانک و بعد اگر درست بود ایدی اون کاربر میفرستم به فرم بعد ؟ الان باید به چه شکل تغییرات بدم ؟


private void button2_Click(object sender, EventArgs e)
{

string user = txtuser.Text;
string pass = txtpass.Text;
var db = new usersDataContext();
var q = db.users.Where(c => c.username == user && c.password == pass);
if (q.Count() != 0)
{
var UserId = (from p1 in db.users where p1.username ==user select p1.id).FirstOrDefault();
new Form1(UserId).ShowDialog();
this.Hide();

}
else
{
PMessageBox.Show("نام کاربری یا کلمه عبور اشتباه است", "پیام سیستم | ورود ناموفق", PMessageBoxIcons.Warning, 2);
}
}

Mahmoud.Afrad
چهارشنبه 09 اسفند 1391, 16:29 عصر
چون سطوح دسترسی از قبل مشخص نیست و در زمان ساخت یوزر تعیین میشه میتونید به ازای هر سطح دسترسی(هر چک باکس) در جدول یوزر یک ستون از نوع bit در نظر بگیرید.(اما اگر چک باکسها نبود دسترسی ها رو در یک جدول جدا تعیین میکردیم و جدول یوزر را با اون ارتباط میدادیم)

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

مثال:
جدول زیر رو در نظر بگیرید:

TABLE [dbo].[User](
[Id] [int] IDENTITY(1,1) NOT NULL,
[RoleName] [nvarchar](50) NOT NULL,
[Username] [nvarchar](50) NOT NULL,
[Password] [nvarchar](50) NOT NULL,
[CanInsert] [bit] NOT NULL,
[CanUpdate] [bit] NOT NULL,
[CanDelete] [bit] NOT NULL,
[CanSearch] [bit] NOT NULL,
[CanGetBackup] [bit] NOT NULL,
[CanRestoreBackup] [bit] NOT NULL,
[CanGetYearlyReport] [bit] NOT NULL,
CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED
(
[Id] ASC
)

در هنگام ایجاد کاربر جدید سطح دسترسی رو براش تعریف کنید:

using (DataClasses1DataContext context = new DataClasses1DataContext())
{
User u = new User();
u.RoleName = comboBox1.Text;
u.CanInsert = chbInsert.Checked;
u.CanUpdate = chbUpdate.Checked;
// ....

context.Users.InsertOnSubmit(u);
context.SubmitChanges();
MessageBox.Show("کاربر جدید ایجاد شده");
}


در فرم لاگین به اینصورت عمل کنید:

using (DataClasses1DataContext context = new DataClasses1DataContext())
{
User currentUser = context.Users.SingleOrDefault(u => u.Username == txtUsername.Text && u.Password == txtPassword.Text);
if (currentUser != null)
{
FrmMain frm = new FrmMain(currentUser);
this.Hide();
frm.ShowDialog();
this.Close();
}
}


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

public FrmMain(User currentUser)
{
InitializeComponent();

this.گزارشاتToolStripMenuItem.Visible = currentUser.CanSeeYearlyReaport;
this.panelAdvanceSearch.Visible = currentUser.CanSearch;
// ...
}

Yanehsar
چهارشنبه 09 اسفند 1391, 17:27 عصر
چون سطوح دسترسی از قبل مشخص نیست و در زمان ساخت یوزر تعیین میشه میتونید به ازای هر سطح دسترسی(هر چک باکس) در جدول یوزر یک ستون از نوع bit در نظر بگیرید.(اما اگر چک باکسها نبود دسترسی ها رو در یک جدول جدا تعیین میکردیم و جدول یوزر را با اون ارتباط میدادیم)

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

خیلی ممنون از دوست عزیزمون Mahmoud.Afrad (http://barnamenevis.org/member.php?71297-Mahmoud.Afrad) که راهنمائی کرد ما رو
چون من لینک کار تسلط ندارم نمی تونستم به خوبی ایشون راهنمائیتون کنم.
موافق باشید

mohammad2407
چهارشنبه 09 اسفند 1391, 17:37 عصر
اقا محمود دستت درد نکنه 99 درصد درست شد

ولی به شکل زیر عمل کردم

فیلد ها و.. در جدول users ساختم و نوع bit هم قرار دادم

موقع ساخت یوزر جدید هم OK کردم و تست هم کردم به شکل زیر شد کد قسمت ساخت کاربر :

string _username = username.Text;
string _pssword = password.Text;
string _firstname = firstname.Text;
string _lastname = lastname.Text;
string _post = post.Text;

var db = new usersDataContext();
user tb = new user();

tb.username = _username;
tb.password = _pssword;
tb. firstname = _firstname;
tb. lastname = _lastname;
tb. post = _post;
tb. gender = gender;
tb.uinsert = uinsert.Checked;
tb.udelete = udelete.Checked;
tb.uupdate = uupdate.Checked;
tb.userch = userch.Checked;
tb.bachup = bachup.Checked;
tb.uusers = uusers.Checked;
tb.usystem = usystem.Checked;
db.users.InsertOnSubmit(tb);
db.SubmitChanges();
dataGridView1.DataSource = db.users;
///////////////////////////////////
PMessageBox.Show("کاربر جدید ثبت شد", "پیام سیستم،لطفا صبر کنید...", PMessageBoxIcons.Information, 2);

و در فرم لوگین هم به صورت زیر قرار دادم

var db = new usersDataContext();
user currentUser = db.users.SingleOrDefault(u => u.username == txtuser.Text && u.password == txtpass.Text);
if (currentUser != null)
{
new Form1(currentUser).ShowDialog();
this.Hide();
this.Close();
}
اقا محمود در فرم لوگین هم از کد new Form1(currentUser).ShowDialog(); ایراد میگیره
در فرم اول هم برای کلید ثبت به این شکل قرار دادم که خطا گرفت



public Form1(user currentUser)
{
InitializeComponent();
this.btn_insert.Visible = currentUser.uinsert;
}


اقا محمود از قسمت currentUser.uinsert; خطا گرفت
من یک سری اطلاعات در مورد بانک بدم

اسم جدول اطلاعات کاربرای من users هست اسم فایل LINQ من users.dbml هست ؟

Mahmoud.Afrad
چهارشنبه 09 اسفند 1391, 18:35 عصر
یعنی این خطا پیغام نمیده؟ خب آخه چرا متن خطا رو نمی زارید.

همه ستونهای این جدول باید nullable = false باشه.

mohammad2407
چهارشنبه 09 اسفند 1391, 18:51 عصر
بله همه چی درسته این هم متن خطا

Error 1 'Irankhodro.Form1' does not contain a constructor that takes 1 arguments

mohammad2407
چهارشنبه 09 اسفند 1391, 19:05 عصر
آقا محمود وقتی میرم در فرم اول کد زیر اضافه میکنم این مشکل حل میشه

public Form1(user currentUser)
{
// TODO: Complete member initialization
this.currentUser = currentUser;
}

mohammad2407
چهارشنبه 09 اسفند 1391, 19:10 عصر
مشکل حل شد

mohammad2407
چهارشنبه 09 اسفند 1391, 19:15 عصر
اقا محمود الان هیچ خطایی نداره ولی وقتی برنامه اجرا میکنم و یوزر و رمز میزنم برمیگرده به فرم اول و از قسمت زیر



public Form1(user currentUser)
{
// TODO: Complete member initialization
this.currentUser = currentUser;
this.btn_insert.Visible = currentUser.uinsert;
this.بکاپToolStripMenuItem.Visible = currentUser.bachup;
}


و از قسمت های

this.btn_insert.Visible = currentUser.uinsert;
this.بکاپToolStripMenuItem.Visible = currentUser.bachup;


از قسمت بالا ایراد میگیره و هیچ متن خطایی هم نداره و همه چی هم درسته

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

Mahmoud.Afrad
چهارشنبه 09 اسفند 1391, 20:26 عصر
InitializeComponent(); نباید از سازنده حذف بشه.

mohammad2407
چهارشنبه 09 اسفند 1391, 23:01 عصر
آقا محمود گل خیلی لطف کردی مشکل حل شد

شما خیلی حرفه ای هستید در سی شارپ

این پروژه ای که من داشتم شاید بتونم با قدرت بگم که شما 30 الی 50 درصد کار های اونو انجام دادین

به نظر من رتبه شما باید مدیر سایت تغییر کنه

چون از وقتی که من در این سایت عضو شدم تنها شما مشکلات منو حل کردیت

بسیار ممنونم از شما

mohammad2407
پنج شنبه 10 اسفند 1391, 00:20 صبح
اقا محمود الان هیچ مشکلی در فرم اول نداره ولی در فرم های دیگه که کد زیر رو قرار میدم عمل نمیکنه و هیچ دسترسی در نظر نمیگیره


public Form5(user currentUser)
{
InitializeComponent();

this.currentUser = currentUser;
this.ثبترکوردToolStripMenuItem.Visible = currentUser.uinsert;
}



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

public user currentUser { get; set; }

ولی عمل نمیکنه