نحوهی سفارشی سازی کلاس پایهی تمام Viewهای برنامه و معرفی inherits@
در نگارشهای پیشین ASP.NET MVC، امکان تعویض کلاس پایهی Viewها، در فایل web.config واقع در پوشهی ریشهی Views وجود داشت. با حذف این فایل و ساده سازی و محول کردن مسئولیتهای آن به فایل جدید view imports، اینبار برای تعریف کلاس پایهی viewها میتوان به صورت ذیل عمل کرد:
using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc.Razor; namespace Core1RtmEmptyTest.StartupCustomizations { public abstract class MyCustomBaseView<TModel> : RazorPage<TModel> { public bool IsAuthenticated() { return Context.User.Identity.IsAuthenticated; } #pragma warning disable 1998 public override async Task ExecuteAsync() { } #pragma warning restore 1998 } }
پس از تعریف این کلاس، برای ثبت و معرفی آن به فایل ViewImports.cshtml_ مراجعه کنید و این یک سطر را به ابتدای آن اضافه نمائید:
@inherits Core1RtmEmptyTest.StartupCustomizations.MyCustomBaseView<TModel>
برای نمونه پس از سفارشی سازی صفحهی پایهی تمام Viewها، اکنون یک سطر ذیل را در هر view ایی میتوان تعریف و استفاده کرد:
Is Current User Authenticated? @IsAuthenticated()
معرفی functions@
دایرکتیو جدید functions@، بسیار شبیه است به دایرکتیو قدیمی و حذف شدهی helper@، که در نگارشهای پیشین Razor معرفی شده بود:
@functions { public string Test() { return message; } readonly string message = "test"; }
@Test() <br /> @message
معرفی inject@
توسط دایرکتیو جدید inject@، یک خاصیت عمومی به ASP.NET Core اعلام میشود و سپس مقدار دهی آن بر اساس تنظیمات IoC Container برنامه به صورت خودکار صورت خواهد گرفت. برای مثال زمانیکه میخواهیم به سرویس توکار HostingEnvironment در یک View دسترسی پیدا کنیم، میتوان در ابتدای آن نوشت:
@inject Microsoft.AspNetCore.Hosting.IHostingEnvironment Host;
[Microsoft.AspNetCore.Mvc.Razor.Internal.RazorInjectAttribute] public Microsoft.AspNetCore.Hosting.IHostingEnvironment Host { get; private set; }
اکنون برای استفادهی از آن خواهیم داشت:
<div> Running in @Host.EnvironmentName </div>
به علاوه باید دقت داشت اگر تعریف inject@ فوق را در فایل view import قرار دهیم، این سرویس در اختیار تمام Viewهای برنامه قرار خواهد گرفت و دیگر نیازی به قرار دادن آن در یک کلاس پایهی سفارشی نیست.
یکی از مفیدترین استفادههای از قابلیت تزریق سرویسها در Viewها میتواند دسترسی به سرویس تامین تنظیمات برنامه باشد (که در مورد نحوهی تامین آن در مطلب «ارتقاء به ASP.NET Core 1.0 - قسمت 7 - کار با فایلهای config» بیشتر بحث شد):
@inject IOptions<SmtpConfig> Settings;
شرح حال ابزارهای گزارشگیری موجود
من منهای طراح گرافیکی DevExpress XtraReports که ذکر کردید، مابقی امکاناتش رو تا الان با iTextSharp پیاده سازی کردم. به نظرم نیازی هم به طراح ندارد. روش Code first هست. البته فقط خروجی PDF داره. با پشتیبانی کامل فارسی و راست به چپ. اصلا برای راست به چپ درستش کردم!
این یک نمونه خروجی Dynamic crosstab ایی است که چند وقت قبل در اینجا (^) در موردش توضیح دادم. فکر نمیکنم هیچکدوم از ابزارهای موجود بتونند از یک کوئری LINQ و اون هم Dynamic یک خروجی به این شکل رو تولید کنند : (^)
فرآیند داده کاوی در Microsoft SQL Server (بخش یک)
مقدمه
بطور کلی داده کاوی به دو قسمت زیر تقسیم میشود:
1- اهداف توصیفی (Descriptive Goal): بدنبال یافتن الگوها و روابط بین دادهها هستیم، بدین ترتیب مدلی برای توصیف بهتر دادهها بدست خواهد آمد.
2- اهداف پیش بینانه (Predictive Goal): بدنبال انجام پیش بینی با استفاده از الگوها و مدلهای فوق هستیم.
همچنین مراحل اجرای یک پروژه داده کاوی شامل مراحل زیر است:
1- تحلیل: مهمترین فعالیت در این فاز، فهم عمیق مسئله و شناخت درست مسئله و شناسائی مفاهیم کلیدی (Key Concept) در مسئله است.
2- طراحی: مهمترین فعالیت این فاز، فرموله کردن مسئله با استفاده از مفاهیم کلیدی است.
3- پیاده سازی/ نگهداری و بهبود
مراحل کاری داده کاوی بر اساس استاندارد CRISP-DM
محصول
مشترک شرکتهای SPSS, Teradata, NCR و دایملر- کرایسلر است و یک فرآیند
استاندارد Cross-Industry برای داده کاوی است که به طور گسترده ای استفاده
میشود. مراحل کاری در این مدل به شش فاز اصلی به شرح زیر تقسیم میشوند:
1. درک پروژه و فهم حوزه کاربرد (Business Understanding):
به طور صریح و آشکار اهداف و نیازمندیها مشخص میشود. ترجمه اهداف و
محدودیت آن در قاعده سازی، تعریف مسئله داده کاوی و مهیا کردن استراتژی
اولیه برای نائل شدن به اهداف در این مرحله تعریف می شود.
2. انتخاب دادهها (Data Understanding):
این مرحله شامل جمع آوری دادهها برای استفاده از تحلیل اکتشافی و مشخص
کردن اطلاعات اولیه برای ارزیابی دادههای با کیفیت و انتخاب دادههای
مفید و مورد نیاز میباشد.
3. آماده سازی دادهها (Data Preparation):
آماده کردن دادههای اولیه خام به دادههای نهایی، این دادها در کلیه
مراحل بعدی استفاده میشود و از این نظر این مرحله تحلیل و تلاش بیشتری را
میطلبد. انتخاب عناصر و شناسههای تحلیل شده را برای کاوش دادهها
اختصاص میدهیم و با تمیز کردن دادههای خام آن را برای ابزارهای مدل سازی
آماده می کنیم.
4. مدل سازی (Modeling):
با انتخاب و به کار بستن تکنیکهای مدل سازی مناسب و روش داده کاوی معین
نتایج مدل سازی را بهینه می کنیم، که در صورت نیاز میتوانیم با برگشت به
عقب تحلیل مدل سازی را بهینهتر نماییم.
5. ارزیابی (Evaluation):
مشخص کردن اینکه آیا مدل انتخابی، ما را به اهدافمان که در اولین مرحله
تعیین کردیم، می رساند. اتخاذ تصمیم راجع به استفاده از نتایج داده کاوی
برای اعتبارسنجی نیز در این مرحله انجام می شود.
6. استقرار (Deployment):
استفاده کردن از مدل ایجاد شده، برای مثال میتواند تولید یک گزارش ساده از
خروجیها را نام برد، و برای یک مثال پیچیده تکمیل کردن پردازش داده کاوی
موازی در سایر حوزهها میباشد، که این الگوها به یک دانش مفید و قابل
استفاده تبدیل میشوند و پس از بهبود آنها، الگوهایی که کارا محسوب می
شوند در یک سیستم اجرایی به کار گرفته خواهند شد.
مراحل کاری داده کاوی در بستر تکنولوژی Microsoft
داده کاوی غالباً به عنوان فرآیند استخراج اطلاعات، الگوها و روندهای موجود در مجموعه ی عظیمی از دادهها یاد می شود. این الگوها و روندها را می توان به عنوان یک مدل کاوشی تعریف نمود. به بیانی دیگر ایجاد یک مدل کاوشی بخشی از فرآیند بزرگتری است که در برگیرنده ی همه مراحل؛ از تعریف مسئله که مدل حل خواهد نمود تا اجرای مدل در محیطهای کاری است. می توان این فرآیند را با استفاده از 6 مرحله اساسی زیر تعریف نمود:
باید در نظر داشت که تهیه یک مدل داده کاوی، فرآیندی چرخشی، پویا و تکرار پذیر می باشد و ممکن است هر یک از این مراحل آن قدر تکرار شود، تا مدل مناسبی تهیه گردد.
- تعریف مسئله (Defining the Problem):
تعریف روشنی از مشکل و مسئله کسب و کار است. این مرحله شامل تجزیه و تحلیل نیازمندیهای کسب وکار، تعریف دامنه مشکل، تعریف معیارهایی که با آن مدلها ارزیابی خواهد شد و تعریف هدف نهایی پروژه ی داده کاوی است.
- آماده سازی دادهها (Preparing Data):
یکپارچه سازی و پالایش داده هایی است که در مرحله ی تعریف مسئله فرآیند معین شده است. SSIS حاوی تمامی ابزارهای ملزوم برای تکمیل این مرحله میباشد.
- بررسی دادهها (Exploring Data):
به منظور تصمیم گیریهای مناسب در هنگام تهیه مدل، می بایست دادهها را درک نمود و پس از آن می توان تصمیم گیری در مورد وجود دادههای مخدوش در مجموعه داده و در نهایت استراتژی مناسب برای رفع این مشکلات اتخاذ نمود. Data Source view Designer موجود در BIDS حاوی ابزارهای جامعی برای بررسی و شناخت دادهها شامل محاسبه ارقام حداقل و حداکثر، محاسبه میانگین و انحراف معیار و بررسی توزیع دادهها می باشد.
- تهیه مدل ها (Building Models):
پیش از تهیه مدل باید، دادهها را به دو دسته ی دادههای آموزشی و اعتبارسنجی (آزمایشی) تقسیم نمود. از دادههای آموزشی برای تهیه مدل و از دادههای اعتبارسنجی برای آزمایش صحت مدل با ایجاد سوالاتی در مورد صحت پیش بینیها استفاده نمود. پس از تعریف ساختار کاوشی، می بایست به پردازش مدل پرداخته شود و ساختارهای خالی با الگوهایی که مدل را توصیف می نمایند، پُر شوند. این مرحله با عنوان آموزش مدل شناخته می شود.
- بررسی و ارزیابی مدلها (Exploring and Validating Models):
این مرحله شامل بررسی مدلهای ایجاد شده به منظور آزمودن کارایی آنهاست. می توان مدلها را با ابزارهای موجود در Designer از جمله نمودار صعود و یا ماتریس دسته بندی بررسی نمود.
- اجرا و بروزرسانی مدلها (Deploying and Updating Models):
این مرحله شامل اجرای مدل هایی است که بهترین کارائی را در یک محیط عملیاتی داشته اند. پس از استقرار مدلهای کاوشی در یک محیط عملیاتی می توان از این مدلها برای پیش بینی هایی بهره گرفت.
مراحل سه گانه موجود در ساخت یک مدل کاوش
- ایجاد ساختار کاوشی (Mining Structures): تعریف یک ساختار کاوشی شامل، تعیین تعداد ستونهای ورودی، تعداد ستونهای قابل پیش بینی و الگوریتم وابسته به آن میباشد. ساختار کاوشی یک ساختار داده ای است که محدوده ی داده هایی را که از روی آنها مدلهای کاوش ساخته می شود را تعریف می نماید.
- آموزش مدل (Model Training): یک مدل کاوشی، الگوریتمهای کاوش را به داده هایی که ساختار کاوش ارائه می نماید، اعمال می کند. به بیان دیگر استفاده و کاربرد هر ستون و الگوریتمی که برای ساخت مدل استفاده می شود را تعریف می کند، پس شامل داده منبع اصلی نیست، بلکه شامل اطلاعاتی است که توسط الگوریتم کشف می شود. به آموزش مدل، پردازش مدل نیز گفته میشود و زمانی که یک مدل پردازش می شود داده هایی که توسط ساختار کاوش تعریف شده اند، از طریق الگوریتمهای داده کاوی انتخابی منتقل می شوند، الگوریتم؛ الگوها و روندها را جستجو می کند و در ادامه این اطلاعات در مدل ذخیره می شوند. از این رو پس از یادگیری و آموزش مدل، الگوهای بدست آمده در مدل کاوش ذخیره می شوند.
- پیش بینی مدل (Prediction): غالباً مهمترین مرحله و هدف نهایی در پروژههای داده کاوی است. پیش بینی به کشف اطلاعات ناشناخته با استفاده از الگوهای یافته شده از سوابق دادهها اشاره دارد. در پیش بینی به یک مدل کاوشی آموزش دیده و یک مجموعه داده ی جدید نیاز است. و در طول پیش بینی موتور داده کاوی، قواعد بدست آمده در مرحله یادگیری را در مورد مجموعه داده ی جدید بکار می برد و نتایج پیش بینی را به هر Case ورودی تخصیص می دهد.
با توجه به آخرین نگارشهای موجود Angular و React، انتخاب شما برای انجام یک پروژه بزرگ کدام است؟
هنگامی که حجم دادهها کم باشد شاید روش دسترسی و الگوریتم مورد استفاده اهمیتی نداشته باشد اما با افزایش حجم دادهها روشهای بهینهتر تاثیر مستقیم در کارایی برنامه دارند.
در این مثال سعی بر این است که در یک سناریوی خاص تفاوت بین Dictionary و List را بررسی کنیم :
فرض کنید 2 کلاس Student و Grade موجود است که وظیفهی نگهداری اطلاعات دانش آموز و نمره را بر عهده دارند.
public class Grade { public Guid StudentId { get; set; } public string Value { get; set; } public static IEnumerable<Grade> GetData() { for (int i = 0; i < 10000; i++) { yield return new Grade { StudentId = GuidHelper.ListOfIds[i], Value = "Value " + i }; } } } public class Student { public Guid Id { get; set; } public string Name { get; set; } public string Grade { get; set; } public static IEnumerable<Student> GetStudents() { for (int i = 0; i < 10000; i++) { yield return new Student { Id = GuidHelper.ListOfIds[i], Name = "Name " + i }; } } }
public class GuidHelper { public static List<Guid> ListOfIds=new List<Guid>(); static GuidHelper() { for (int i = 0; i < 10000; i++) { ListOfIds.Add(Guid.NewGuid()); } } }
ابتدا از LINQ روی لیست برای پیدا کردن نمرهی مورد نظر استفاده کرده و در روش دوم برای پیدا کردن نمرهی هر دانش آموز از Dictionary استفاده شده :
internal class Program { private static void Main(string[] args) { var stopwatch = new Stopwatch(); List<Grade> grades = Grade.GetData().ToList(); List<Student> students = Student.GetStudents().ToList(); stopwatch.Start(); foreach (Student student in students) { student.Grade = grades.Single(x => x.StudentId == student.Id).Value; } stopwatch.Stop(); Console.WriteLine("Using list {0}", stopwatch.Elapsed); stopwatch.Reset(); students = Student.GetStudents().ToList(); stopwatch.Start(); Dictionary<Guid, string> dictionary = Grade.GetData().ToDictionary(x => x.StudentId, x => x.Value); foreach (Student student in students) { student.Grade = dictionary[student.Id]; } stopwatch.Stop(); Console.WriteLine("Using dictionary {0}", stopwatch.Elapsed); Console.ReadKey(); } }
همانگونه که مشاهده میشود در این سناریو خواندن نمره از روی Dictionary بر اساس 'کلید' بسیار سریعتر از انجام یک پرس و جوی LINQ روی لیست است.
زمانی که از LINQ on list
student.Grade = grades.Single(x => x.StudentId == student.Id).Value;
زمانی که از Dictonary
student.Grade = dictionary[student.Id];
در نتیجه اگر نیاز به پیدا کردن اطلاعات بر اساس یک مقدار یکتا یا کلید باشد تبدیل اطلاعات به Dictionary و خواندن از آن بسیار به صرفهتر است.
تفاوت این 2 روش وقتی مشخص میشود که میزان دادهها زیاد باشد.
در همین رابطه (1 ، 2)
DictionaryVsList.zip
چگونه با استفاده از لوسین مطالب را ایندکس کنیم؟
مقدمه
اگر به جستجوی سایت دقت کرده باشید، قابلیتی تحت عنوان پیشنهاد «عبارات مشابه» به آن اضافه شده است:
این مورد بر اساس ماژول غلط یاب املایی لوسین تهیه شده و بسیار شبیه به "did you mean" جستجوی گوگل است. در ادامه به نحوه پیاده سازی آن خواهیم پرداخت.
کتابخانههای مورد نیاز
علاوه بر کتابخانه لوسین، نیاز به دریافت پروژه Contrib آن نیز میباشد تا بتوان از اسمبلی Lucene.Net.Contrib.SpellChecker.dll موجود در آن استفاده کرد.
نحوه کار با غلط یاب املایی لوسین
خلاصه کار با غلط یاب املایی لوسین همین چند سطر ذیل است:
var indexReader = IndexReader.Open(FSDirectory.Open(indexPath), readOnly: true); // Create the SpellChecker var spellChecker = new SpellChecker.Net.Search.Spell.SpellChecker(FSDirectory.Open(indexPath + "\\Spell")); // Create SpellChecker Index spellChecker.ClearIndex(); spellChecker.IndexDictionary(new LuceneDictionary(indexReader, "Title")); spellChecker.IndexDictionary(new LuceneDictionary(indexReader, "Body")); //Suggest Similar Words var results = spellChecker.SuggestSimilar(term, number, null, null, true);
در ادامه شیء spellChecker را آغاز خواهیم کرد. بهتر است پوشه تولید فایلهای آن با پوشه ایندکس اصلی یکسان نباشد. اگر یکسان درنظر گرفته شود، تمام مداخل جدید به ایندکس موجود اضافه خواهند شد که میتواند سرعت جستجوی معمولی را کاهش دهد.
سپس کار تهیه ایندکس جدید غلط یاب املایی، شروع خواهد شد. متد spellChecker.ClearIndex، اطلاعات موجود در ایندکسی قدیمی را حذف کرده و سپس spellChecker.IndexDictionary، فیلدهایی را که نیاز داریم در تهیه غلط یاب املایی حضور داشته باشند، مشخص میکند.
همانطور که ملاحظه میکنید ایندکس جدید تهیه شده، بر اساس بانک اطلاعاتی واژههای موجود در ایندکس اصلی برنامه که توسط indexReader معرفی شده، تهیه میشود. برای نمونه در تصویر ابتدای مطلب جاری، واژههای پیشنهادی، واژههایی هستند که پیشتر یکبار تایپ شده و در بانک اطلاعاتی برنامه موجود بودهاند.
و در آخر برای استفاده از امکانات تهیه شده، تنها کافی است متد spellChecker.SuggestSimilar را فراخوانی کنیم (در زمانیکه جستجوی اصلی سایت نتیجهای را ارائه نداده است). حاصل لیستی از واژههای مشابه است.
همانطور که میدانید هنگامیگه در ادیتور ارسال مطلب یکی از شبکههای اجتماعی (فیسبوک ، توییتر ، گوگل پلاس و ...) آدرس سایتی را وارد میکنید، بلافاصله لینک پردازش شده و پیش نمایشی از آن وبسایت در ادیتور نمایش داده میشود. برخی پیش نمایشها حاوی عکس، عنوان لینک و خیلی منظم هستند و برخی دیگر فقط نام و عنوان سایت را در برمیگیرند.
برای نمونه به تصاویر زیر دقت کنید:
تصویر فوق مربوط به لینک یک سایت خبری در ادیتور فیسبوک میباشد. همانطور که میبینید عنوان خبر، عکس و توضیح مختصری در مورد خبر، با نظم و ترتیبی خاص نمایش داده شده است.
حال به تصویر زیر که مربوط به لینکی از همین سایت میباشد دقت کنید:
همانطور که میبینید، تنها لینکی ساده، بدون هیچ پیش نمایشی از وب سایت نشان داده شده است.
دلیل این اتفاق وجود یا عدم وجود متاتگهایی که Social Media Metadata نامیده میشوند میباشند. چنانچه وب سایتی بوسیلهی این متاتگها برای شبکههای اجتماعی بهینه سازی شده باشد، با قرار دادن هر لینکی در ادیتور شبکههای اجتماعی، پیش نمایشی خوب از آن مطلب به نمایش گذاشته میشود. اهمیت این متاتگها در سایتهای خبری، فروشگاهها، سایتهای آموزشی و ... بسیار بالا میباشد تا از مزایای جذب کاربر توسط شبکههای اجتماعی بهرهمند شوند. با این مقدمه میرویم به سراغ معرفی و چگونگی بکارگیری این متاتگ ها.
بخش اول: متاتگهای موردنیاز برای لینکهای حاوی مقالات:
ابتدا تگ html خود را به شکل زیر تغییر دهید:
<html itemscope itemtype="http://schema.org/Article">
<title>عنوان صفحه ، حداکثر 60 تا 70 کارکتر باشد</title> <meta name="description" content="شرح صفحه ، حداکثر 150 کارکتر باشد" /> <!-- Schema.org markup for Google+ --> <meta itemprop="name" content="نام یا عنوان صفحه"> <meta itemprop="description" content="شرح صفحه"> <meta itemprop="image" content="نشانی اینترنتی عکسی که در پیشنمایش نشان داده میشود"> <!-- Twitter Card data --> <meta name="twitter:card" content="summary_large_image"> <meta name="twitter:site" content="کپی رایت نام سایت"> <meta name="twitter:title" content="نام یا عنوان صفحه"> <meta name="twitter:description" content="شرح صفحه"> <meta name="twitter:creator" content="نویسنده"> <!-- Picture size at least 280x150px -->عکس پیشنمایش با ابعاد حداقل <meta name="twitter:image:src" content="نشانی اینترنتی عکس مطلب"> <!-- Open Graph data --> <meta property="og:title" content="عنوان صفحه" /> <meta property="og:type" content="article" /> <meta property="og:url" content="نشانی سایت" /> <meta property="og:image" content="نشانی عکس مطلب" /> <meta property="og:description" content="شرح مطلب" /> <meta property="og:site_name" content="نام سایت" /> <meta property="article:published_time" content="تاریخ انتشار" /> <meta property="article:modified_time" content="تاریخ بروزرسانی" /> <meta property="article:section" content="نام بخش محتوی متن مقاله" /> <meta property="article:tag" content="نام تگ محتوی متن مقاله" /> <meta property="fb:admins" content="شناسه عددی کاربری شما در فیسبوک" />
بخش دوم: متاتگهای موردنیاز برای لینکهای حاوی محصولات:
ابتدا تگ html خود را به شکل زیر تغییر دهید:
<html itemscope itemtype="http://schema.org/Product">
<title>عنوان صفحه</title> <meta name="description" content="شرح صفحه" /> <!-- Schema.org markup for Google+ --> <meta itemprop="name" content="عنوان صفحه"> <meta itemprop="description" content="Tشرح صفحه"> <meta itemprop="image" content="نشانی عکس محصول یا کالا"> <!-- Twitter Card data --> <meta name="twitter:card" content="product"> <meta name="twitter:site" content="کپی رایت سایت"> <meta name="twitter:title" content="عنوان صفحه"> <meta name="twitter:description" content="شرح محصول یا کالا"> <meta name="twitter:creator" content="نویسنده"> <meta name="twitter:image" content="نشانی عکس محصول یا کالا"> <meta name="twitter:data1" content="قیمت محصول یا کالا"> <meta name="twitter:label1" content="Price"> <meta name="twitter:data2" content="رنگ کالا یا محصحول"> <meta name="twitter:label2" content="Color"> <!-- Open Graph data --> <meta property="og:title" content="عنوان صفحه" /> <meta property="og:type" content="article" /> <meta property="og:url" content="نشانی سایت" /> <meta property="og:image" content="عکس محصول یا کالا" /> <meta property="og:description" content="شرح مصحول" /> <meta property="og:site_name" content="نام سایت" /> <meta property="og:price:amount" content="قیمت محصول یا کالا" /> <meta property="og:price:currency" content="واحد ارزی قیمت" />
در پایان
برای مشاهده لیست کاملی از اسکیما اینجا را ببینید.
og مخفف Open Graph Protocol میباشد که میتوانید مطالب کاملی را در مورد آن اینجا بخوانید.
و برای آشنایی بیشتر با TwitterCard هم این لینک را مشاهده کنید.
public class ApplicationUser : IdentityUser<string, CustomUserLogin, CustomUserRole, CustomUserClaim> { public ApplicationUser() { Id = Guid.NewGuid().ToString(); } // ... }
مقدمه ای بر سیستم مبتنی بر نقش کاربران
یک سیستم مدیریت کاربر مبتنی بر نقش، سیستمی است که در آن نقشهای گوناگونی تعریف میگردد. به گونهای که هر نقش شامل یک سری دسترسی هایی است که به کاربر اجازه میدهد تا به بخشی از سیستم دسترسی داشته باشد. هر کاربر در این سیستم میتواند یک و یا چند نقش متفاوت داشته باشد و بر اساس آن نقشها و دسترسیهای تعریف شده، درون هر نقش به قسمتی از سیستم دسترسی داشته باشد.بر اساس این تعریف ما در نهایت سه موجودیت نقش (Role)، دسترسی (Permission) و کاربر (User) را خواهیم داشت. در این سیستم دسترسی را اینگونه تعریف میکنیم:
دسترسی در یک سیستم، مجموعهای از حوزهها و یا ناحیههایی است که در سیستم تعریف میشود. این حوزهها میتوانند شامل یک متد یا مجموعهای از متدهای نوشته شده و یا فراتر از آن، شامل مجموعهای از کنترلرها باشد که کاربر اجازهی فراخوانی آنها را دارد.
بدیهی است کاربر برای ما موجودیتی مشخص است. یک کاربر ویژگیهایی مانند نام، نام کاربری، سن، رمز عبور و ... خاص خود را داراست که به واسطه این ویژگیها از کاربری دیگر تمییز داده میشود. کاربر در سیستم طی دو مرحله جداگانه Authentication و Authorization مجاز است تا از بخشهایی از سیستم استفاده کند. مرحله Authentication به طور خلاصه شامل مرحلهای است که هویت کاربر (به عنوان مثال نام کاربری و رمز عبور) تایید صلاحیت میشود. این مرحله در واقع تایید کننده کاربر است و اما بخش بعدی که ما قصد داریم تا در این مورد راهکاری را ارائه دهیم بخش Authorization است. در این بخش به کاربر بر اساس نقش وی دسترسیهایی اعطا میگردد و کاربر را به استفاده از بخشهایی از سیستم مجاز میدارد.
دیاگرام زیر نمود سه موجودیت کاربر، نقش و دسترسی میباشد.
برای شرح دیاگرام فوق این چنین میتوان گفت که هر کاربر مجاز است چندین نقش داشته باشد و هر نقش نیز میتواند به چندین کاربر انتساب شود. در مورد دسترسیها نیز به همین صورت، هر دسترسی نیز میتواند به چندین نقش انتساب شود.
ارائه یک سیستم مبتنی بر نقش کاربران با استفاده از تکنولوژی Web API و AngularJs
- تعریف هر یک از متدهای اتمیک به عنوان یک مجوز دسترسی: در این روش نام کنترلر و نام متد به عنوان یک دسترسی تعریف خواهد شد. در این روش به ازای هر متد ما یک آیتم جدید را باید به جدول Permissions، اضافه نماییم و در نهایت برای تعریف یک نقش و انتساب دسترسیها به یک کاربر، بایستی یک مجموعه چک باکس را که در نهایت به یک متد API ختم میشود، فعال یا غیر فعال کنیم.
- تعریف ناحیههای مختلف و کنترلهای قابل انجام در آن ناحیه: در این روش ما قصد داریم تا مجموعهای از متدها را که هدف مشترکی را انجام خواهند داد، در یک ناحیه و یک کنترل بگنجانیم و از به وجود آمدن تعداد زیادی مجوز دسترسی جلوگیری نماییم. به عنوان مثال فرض کنید میخواهیم یک سطح دسترسی را با نام ویرایش کاربران تعریف کنیم. همانگونه که گفتیم ممکن است برای یک عملیات، دو و یا چندین متد درون یک کنترلر تعریف شوند. حال ما این متدها را درون یک ناحیه دسترسی قرار خواهیم داد و آن را در یک حوزه و یک کنترل (Area & Control) میگنجانیم.