چون سطوح دسترسی از قبل مشخص نیست و در زمان ساخت یوزر تعیین میشه میتونید به ازای هر سطح دسترسی(هر چک باکس) در جدول یوزر یک ستون از نوع 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;
// ...
}