מדריך ASP.NET MVC – הרשאות
בפרק הקודם בנינו את מסד הנתונים עפ"י המודל. בפרק זה נרחיב את המסד ע"י תמיכה בהרשאות.
ASP.NET מכיל תשתית לניהול משתמשים הנקראת Membership. תשתית זו רלוונטית גם בעבודה עם ASP.NET MVC. על מנת שנוכל ליהנות מתשתית זו עלינו לעדכן את ה-Schema של מסד הנתונים כך שתכיל את הטבלאות הנדרשות.
להורדת הקוד של הפרק הקודם לחץ כאן
פתח חלון פקודה חדש ע"י: Start | cmd
שנה את הספרייה הנוכחית לספריית ההתקנה של NET Framework.
cd c:\Windows\Microsoft.NET\Framework\v4.0.30319
הרץ את הפקודה הבאה aspnet_regsql.exe:
לחץ "Next" ובחר את האפשרות "Configure SQL Server for application services"
לחץ "Next" ובחר את מסד הנתונים המתאים:
חלץ על "Next" כמה פעמים שנדרש:
ה-Wizard בו השתמשנו אחראי על יצירת הטבלאות הנדרשות בתוך מסד הנתונים שלנו. וודא ע"י ה-Database Explorer כי אכן הטבלאות נוצרו:
פתח את הקובץ Web.config ועדכן את הקונפיגורציה הבאה:
<configuration>
<connectionStrings>
<remove name="LocalSqlServer"/>
<add name="LocalSqlServer"
connectionString="Data Source=.\SQLEXPRESS;
Initial Catalog=AddressBookDB;
Integrated Security=True"/>
</connectionStrings>
...
</configuration>
שינוי זה מודיע לתשתיות של ASP.NET מיהו מסד הנתונים שמכיל את המידע לגבי משתמשים וסיסמאות.
פתח את Solution Explorer ועמוד על הפרויקט. מהתפריט הראשי בחר: Project | ASP.NET Configuration
בחר "Security" ולאחריו "Create User"
צור שני משתמשים חדשים: ori ו-roni
לאחר יצירת המשתמשים חזור לדף הראשי של ה-Administration Tool ובחר שוב "Security". הדלק את האופציה של "Roles":
לאחר מכן צור שני roles חדשים בשם: admin ו-user ושייך אליהם את המשתמשים שיצרת מקודם. כאשר roni שייכת ל-admin role ו-ori שייך ל-user role
לאחר שיצרנו את הטבלאות במסד הנתונים ומלאנו אותן באינפורמציה על משתמשים חדשים ניתן לעדכן את הקוד על מנת לתמוך בהרשאות.
פתח את הקובץ Controllers\GroupController.cs ועדכן את המחלקה GroupController ע"י עיטורה ב-Attribute בשם Authorize:
[Authorize]
public class GroupController : Controller
{
...
}
הרץ את התוכנית ובחן את השגיאה שמתקבלת:
ה-Attribute שהוספנו למחלקה GroupController גורם לתשתית של ASP.NET MVC למנוע גישה לכל ה-Actions של המחלקה עבור משתמשים שאינם מזוהים. במקרה שכזה התשתית מפנה את המשתמש הלא מזוהה לתצוגת Logon.
הוסף מחלקה חדשה בשם "LoginDetails" לספריית ה-Models אשר מייצגת את פרטי המשתמש:
public class LoginDetails
{
[Required(ErrorMessage = "Please specify a user name")]
[Display(Name = "User Name")]
public string UserName { get; set; }
[Required(ErrorMessage = "Please specify a password")]
[Display(Name = "Password")]
[DataType(DataType.Password)]
public string Password { get; set; }
}
הוסף Controller חדש בשם AccountController ועדכן בתוכו Actions חדשים אשר מטפלים בפעולת ה-Logon:
public class AccountController : Controller
{
[HttpGet]
public ActionResult Logon()
{
return View();
}
[HttpPost]
public ActionResult Logon(string userName, string password)
{
if (!Membership.ValidateUser(userName, password))
{
this.ModelState.AddModelError("summary",
"Invalid user name or password");
return View();
}
FormsAuthentication.RedirectFromLoginPage(userName, false);
return null;
}
}
שים לב כיצד הקוד משתמש בתשתית ה-Membership וכן במחלקה FormsAuthentication על מנת לזהות את המשתמש. מחלקות אלו אינן חדשות ל-ASP.NET MVC וניתן לקרוא עליהן בהרחבה ב-MSDN
צור תצוגה חדשה עבור ה-Logon Action ובחר את המחלקה LoginDetails להיות המודל של התצוגה:
עדכן את הקוד של התצוגה כך שיראה באופן הבא:
@model AddressBook.Models.LoginDetails
@{
ViewBag.Title = "Login";
}
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
<div class="login">
<fieldset>
<div class="editor-label">
@Html.LabelFor(model => model.UserName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.UserName)
@Html.ValidationMessageFor(model => model.UserName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Password)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Password)
@Html.ValidationMessageFor(model => model.Password)
</div>
@Html.ValidationSummary()
<p>
<input type="submit" value="Login" />
</p>
</fieldset>
</div>
}
הרץ את התוכנית וודא כי ניתן לבצע Logon בעזרת המשתמש ori:
עד עכשיו מנענו גישה למערכת ממשתמשים שאינם מזוהים. השלב הבא הוא לבצע הבחנה בין משתמש בעל הרשאות גבוהות הרשאי לעשות שינויים במערכת לבין משתמש רגיל הרשאי רק לקרוא נתונים אבל לא לשנות אותם.
עדכן את כל ה-Actions של כל ה-Controllers אשר משנים נתונים במערכת כך שיהיו מוגנים ע"י ה-Attribute בשם-Authorize, לדוגמא:
[HttpGet]
[Authorize(Roles="admin")]
public ActionResult Create(int parentId)
{
AddressBookDB db = AddressBookDB.Create();
Group parent = (Group)db.GetItemByID(parentId);
Group newGroup = new Group() { Parent = parent };
return View(newGroup);
}
שים לב לשימוש ב-Authorize Attribute. להבדיל מההגדרה הקודמת (ברמת המחלקה) הגדרה זו מציינת במפורש את ה-Roles אשר רשאים להפעיל את ה-Action. בדוגמא ציינו כי רק משתמש שהוא חלק מה-Admin Role רשאי להפעיל את ה-Action.
הרץ את התוכנית, כנס תחת המשתמש ori (שהוא איננו admin) וודא כי לא ניתן לבצע שינויים במערכת. הרץ שוב את התוכנית, כנס הפעם תחת המשתמש roni וודא כי ניתן לבצע שינויים במערכת.
בפרק זה למדנו כיצד להוסיף הרשאות לתוכנית שלנו. ראינו כי הדבר דורש שינויים ברמת מסד הנתונים וכן שימוש ב-Attributes ברמה של ה-Controllers וה-Actions המתאימים.
תגובות בפייסבוק