این مقاله در رابطه با پیاده سازی سطح دسترسی کاربران در پروژه به زبان سی شارپ می باشد که دسترسی کاربران به صفحات را مدیریت می کند. در این پروژه از Linq برای EntityFramework استفاده می کنم. تنها کافیست که دسترسی ها را به نقش ها (Roles) اضافه کنید و نقش ها را به کاربران. سورس پروژه نیز در ادامه ی مطلب برایتان قرار داده شده است …
سطح دسترسی
در صفحه خود فقط از کلاس زیر استفاده کنید، این یک کد ساده نمونه است که چگونگی کارکرد آن را نشان داده است.
btn1.Visible = PermissionControl.CheckPermission("Install"); btn2.Visible = PermissionControl.CheckPermission("UnInstall");
جدول های سطح دسترسی
در دیتابیس دسترسی ۵ جدول داریم:
Users: ذخیره کردن اطلاعات کاربران
Roles: ذخیره کردن نقش ها
Permission: دسترسی ها را مدیریت می کند و ۲دو اسم برای دسترسی دارد، اولی Permission Title می باشد برای نمایش دادن به کاربران و دومی Constant name است که برای کد نوشتن استفاده می شود، مانند کد بالا.
Users Roles: نقش کاربران را ذخیره می کند. هر کاربر می تواند بیش از یک نقش داشته باشد.
Role Permissions: دسترسی ها را برای هر نقش ذخیره می کند.
استفاده از کد
در این فصل نحوه کار با آن را توضیح می دهم:
ابتدا دو نمونه از این مجموعه ها ایجاد کنید.
privatestaticreadonlyHttpSessionState Session = HttpContext.Current.Session; privatestaticreadonlyHttpApplicationState Application = HttpContext.Current.Application;
Session برای هر کاربر می باشد و اپلیکیشن برای همه کاربران می باشد.
در قسمت های بعد، بیشتر با آنها آشنا میشوید.
سپس یک متود با نام CheckPermission ایجاد می کنید که فقط نیاز به عبور ازPermissionConstantNameدارید.
publicstaticbool CheckPermission(string PermissionConstantName) <pre>{ bool result = false; // Is current visitor logged in? if (!HttpContext.Current.User.Identity.IsAuthenticated) { returnfalse; } string Username = HttpContext.Current.User.Identity.Name; //if in user permissions you make changes, you have to clear his permission list if (Application["AffectedUsers"] != null) { var AffectedUsers = (List<string>) Application["AffectedUsers"]; if (AffectedUsers.Contains(Username)) { Session["PermissionList"] = null; AffectedUsers.Remove(Username); Application["AffectedUsers"] = AffectedUsers; } } Users CurrentUser = (from user in DataContext.Context.Users where user.Username == Username select user). SingleOrDefault(); //return True because SuperAdmin has all the permissions! if (CurrentUser.IsSuperAdmin) { returntrue; } if (Session["PermissionList"] == null) { List<string> PermissionList = (from p in DataContext.Context.Permissions join rp in DataContext.Context.RolePermissions on p.PermissionID equals rp.PermissionID join r in DataContext.Context.Roles on rp.RoleID equals r.RoleID join ur in DataContext.Context.UserRoles on r.RoleID ur.RoleID where ur.UserID == CurrentUser.UserID select p.PermissionConstantName).Distinct().ToList(); Session["PermissionList"] = PermissionList; result = PermissionList.Contains(PermissionConstantName); } else { var PermissionList = (List<string>) Session["PermissionList"]; result = PermissionList.Contains(PermissionConstantName); } return result; }
وقتی که این کد را در متود خود فرا خواندید، متود از HttpContext برای پیدا کردن کاربر استفاده می کند و بررسی می کند که آن کاربر اجازه دسترسی دارد یا خیر.
اجازه دسترسی این کاربر در یک لیست در session جمع آوری می شود.
لیست کاربران تحت تاثیر (Affected):
وقتی شما دسترسی نقش را تغییر می دهید، بدین معنا می باشد که کاربر فعلی دیگر اجازه دسترسی به آن صفحه یا شئ را ندارد، و اگر کاربر در آن لیست موجود باشد، باید permission return false را بررسی کنید.
یکی از ویژگی های خوب کنترل دسترسی این است که نیازی به ورود و خروج دوباره برای اعمال تغییرات انجام شده روی کاربر ندارد.
اگر کاربر یک سوپر مدیر (SuperAdmin) باشد، بدین معناست که اجازه دسترسی به همه ی object ها را دارد.
مدیریت دسترسی نقش ها
فقط به یک کنترل gridview ، برای نشان دادن نقش ها نیاز دارید، و به یک لیست checkbox برای دسترسی ها.
مدیریت کاربران
به یک gridview برای نمایش اطلاعات کاربران و چند text boxبرای نقش های موجود نیاز دارید.
چگونه می توانم از این در پروژه فعلی خود استفاده کنم؟
جدول کاربران من خیلی مناسب نیست به این دلیل که فقط روی دسترسی ها تمرکز کردم، شما می توانید آن را اصلاح کنید و از آن در پروژه خود استفاده کنید.
با این روش از کلاس، استفاده کنید:
<asp:LinkButtonID="lbConfigure"runat="server"CommandName="Configure"CommandArgument='<%# Eval("AdminFilePath") %>' Visible='<%#PortalCommon.PermissionControl.CheckPermission("ModuleConfig") %>'>Install module</asp:LinkButton>
یا در code behind:
btn1.Visible = PermissionControl.CheckPermission("Install"); LinkButton1.Visible = PermissionControl.CheckPermission("UnInstall");
اگر می خواهید پروژه من را تست کنید، Connection String را تغییر دهید و cp.edmx را در پوشه Model باز کنید روی فصای سفید بین جدول کلیک راست کنید و Generate database from model را انتخاب کنید و این script را در دیتابیس خود اجرا کنید، از PermissionManager page برای ایجاد نقش جدید استفاده کنید.
موفق باشید !
سلام
من چون به تازگی MVC رو شروع کردم میخوام بدونم چطوری میشه این پیاده سازی رو در MVC انجامش داد؟ آیا با پیادده سازی Identity در پروژه ام این مورد هم کاور میشه؟
با تشکر از شما.
MVC امکانات زیادی داره که خیلی در مورد سطح دسترسی در MVC نیز حتما مقاله ای را آماده میکنیم.
سلام: زحمات زیادی کشیدید ممنونم از شما ،اگر ممکن است سورس برنامه را برای بنده ایمیل کنید ممنون میشم . قبلا از لط شما کمال تشکر را دارم .
مرسی
سلام
من فیلم در مورد سطح دسترسی را نتوانستم ببینمنم و دانلود کنم . آیا امکانش هست آن را برایم ارسال کنید
ضمناً اگر برنامه سطح دسترسی را در دلفی دارید ممنون می شوم برایم ارسال کنید چون من با دلفی کار می کنم
ممنون می شوم مرا راهنمایی کنید