在菜单中应用安全性

applying security among menus

下面是我的模型

public class security
{  
    public long id { get; set; }
    public long user_id { get; set; }
    public long submenu_id { get; set; }
    public bool flag { get; set; }

}

标志是 true 用户有权访问子菜单。

目前我正在做的是。当用户登录时,此模型中的详细信息将被拉出并存储在单独的会话变量中。

eg: - var c = db.security.where(m=> m.user_id == id).Orderby(id);

if(c.submenu_id == 1 && c.flag == true)
   session["mem_add"] = "true";
else
   session["mem_add"] = "false";

然后在布局视图中将检查此会话变量,如果 true 将显示菜单,但问题是有 16 sub menus 并且可以增加它 later.So 我必须创建每个子菜单的单独会话变量。有没有更好的办法解决这个问题?

已编辑

@if(Session["mem_add"] == "true")
{
          <li class="active"><a href="@Url.Action("Index", "UpdateDetail")">
            <img src="@Url.Content("~/Images/Enrollments.png")" alt=""><span class="title"><b>
    @Resources.Resources.UpdateMyDetail</b> </span> </a></li>
}

您的另一个选择是创建 HtmlHleper 的扩展,然后您可以使用它将模型传递到您的菜单并让它生成 MvcHtmlString

public MvcHtmlString CreateMenu(this HtmlHelper helper, MenuSecurityModel)
{
   //create tags, string, etc
   //create logic add/remove meun items depending on flag property on model
   //this can be accomplished also by using a base class for your Controllers, 
   //set the the onactionexecuting variable to set the menu[ put it in session accodingly, retrieve when appropriate
   //Call using Html.RenderAction , partial, etc
   return yourHtmlString;
}

我建议使用视图模型方法来表示您的菜单项

public class MenuItem
{
  public int ID { get; set; }
  public string ControllerName { get; set; }
  public string ActionName { get; set; }
  public string LinkText { get; set; }
  public string ImageUrl { get; set; }
  public bool CanView { get; set; }
}

然后当用户登录时,创建菜单项集合,调用你的方法为用户获取security项,并根据flag属性,为每个菜单设置 CanView 属性。最后将集合存储在Session

然后创建一个仅限子项的方法来生成您的菜单

[ChildActionOnly]
public ActionResult Menu
{
  IEnumerable<MenuItem> model = Session["Menu"] as IEnumerable<MenuItem>;
  // check for null and rebuild if necessary
  return PartialView("_Menu", model);
}

并创建局部视图 _Menu.cshtml

@model IEnumerable<yourAssembly.MenuItem>
<ul>
  @foreach(var menu in Model)
  {
    if (menu.CanView)
    {
      <li>
        <a href=""@Url.Action(menu.ActionName, menu.ControllerName)">
          <img src="@Url.Content(menu.ImagePath)" alt="">
          <span class="title"><b>menu.LinkText</b></span> 
        </a>
      </li>
    }
  }
</ul>

最后在布局页面中,使用Html.Action()调用生成菜单项的方法

@Html.Action("Menu", yourControllerName)