昨天收到一個需求,如果使用者沒有登入,則依欲瀏覽的網頁不同,導向至不同登入頁。
目前維護的是一個 ASP.NET MVC 網站,其中有些頁面是學生登入才看得到,有的頁面是老師登入才看的到。
然後前人就把學生跟老師個別做了登入頁...。
所以同一個站台上有學生登入頁與老師登入頁...
現在專案的身分驗證,預設是導向到學生的登入頁,PM 希望如果是瀏覽老師相關的頁面,應該導向至老師登入頁。
我找到兩個方法,今天講一個比較偷吃步的方法。明天再講比較漂亮的辦法。
ActionFilter,可以幫我們在 Controller 的 Action 執行前後作一些額外的處理。
目前專案的設定,只要沒登入,就跳轉到預設的學生登入頁。所以我只要在學生登入頁的 Action 上方,讓ActionFilter 去檢查,原本登入成功的話要導向的地方,如果是老師相關頁,那就直接導向至老師登入頁就可以了!
ActionFilter 有四個可以覆寫的方法。
這次我們實作 OnActionExecuting
來實踐,進到 Action 前先判斷。
public class TeacherLoginRedirectAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
// 取得原本登入成功要導向的網址
var returnUrl = filterContext.HttpContext.Request.QueryString["returnUrl"];
// 判斷是否是老師權限相關路徑
if (returnUrl.StartsWith("/teachers"))
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary(new
{
action = "login",
controller = "teachers",
returnUrl
}));
}
}
}
這個做法我覺得不漂亮,不過我看了MVC 授權 - 多個登錄頁面 (MVC Authorization - multiple login pages),裡面提到的幾個方法後,以維護這個 超蝦 專案的角度來說,我感覺今天講的這個方法稍微好一點。
而且以後,如果其他頁面也要預設用老師登入頁登入的話,我只要維護這個 ActionFilter 就好,不用每個 Action 各自加 Attribute。至於之後我不在的話,後續維護的人能不能立刻發現這段程式碼,我感覺難說XD
至少目前完成了這個需求,而且更改的地方也不多。要不然再看下去會一直萌生打掉重練登入驗證機制的想法 XD
雖然明天的我一定會重改一次,但今天的我感到很滿意 :D