JQuery导航菜单授权

问题描述:

我想在我的MVC应用程序中使用Jquery创建导航菜单。我正在使用http://users.tpg.com.au/j_birch/plugins/superfish/JQuery导航菜单授权

但是,我想显示基于用户角色的菜单项,即包括asp会员授权逻辑,以便如果用户不具备所需的角色,他不会看到某些菜单项。

任何人都可以建议如何继续。

感谢

+0

我不知道我可能是错的,但我认为菜单将是可见的,如果谁亘古不变的用户有权限访问特定页面单击他可能重定向到拒绝访问页面的菜单项,再次点击我的意见。 – freebird 2012-07-19 12:57:34

+0

是的,可以完成,但如果用户不被允许查看页面,我不想显示菜单项本身。不管怎么说,还是要谢谢你。 – gunnerz 2012-07-19 13:03:57

由于快鱼只能你需要确保它只有在首位,其中定义服务器端右HTML客户端。

你的角色提供者有一个IsUserInRole和GetRolesForUser。你可以用它来建立HTML。

例如:

@if (RoleProvider.IsUserInRole(user.username, "admin")) { 
    <li>Admin<li> 
} 
+0

正如其他评论指出的,我上面所做的并不一定是最有效的,但它很简单明了,并且确保客户永远不会看到他们不应该看到的菜单项。对于您而言,用户绝对不应该看到的菜单项甚至不会放到浏览器中,这对您来说可能是一个安全考虑因素。 (当然,关闭javascript只会让你的菜单变丑,但它仍然会有正确的项目。)你一定要考虑缓存响应,尽管IsUserInRole通常会被缓存,所以每次访问都不会导致数据库查找。 – 2012-07-19 13:57:08

如果在数据库中设置了,那么你可以创建表,一个表将包含菜单和其他人会用映射角色菜单中的用户/角色。

您可能必须创建一个子查询操作,该操作将查询数据库获取特定角色的菜单项并通过局部视图呈现菜单。您甚至可以在会话中为用户保留菜单项,并且通过这种方式可以避免在每个请求中触及数据库。

隐藏菜单项部分解决了问题。您必须使用授权过滤器来保护控制器和操作。

更新:如果你正在做很多客户端的东西,并只与数据通信的MVC应用程序,这个答案更合适。如果您要渲染服务器上的每一页,请使用Steve的答案。

我认为您需要使用返回JsonResult的控制器操作将用户角色传达给客户端。例如。

public class SecurityController : Controller 
{ 
    public ActionResult Roles() 
    { 
     return new JsonResult 
     { 
      Data = System.Web.Security.Roles.GetRolesForUser(), 
      JsonRequestBehavior = JsonRequestBehavior.AllowGet 
     }; 
    } 
} 

然后使用$.ajax检索数据客户端,并在回调从不符合您的要求的DOM删除节点。例如。

<ul id="menu"> 
     <li data-roles="Administrator"> 
      Secured 
     </li> 
     <li>Any</li> 
    </ul> 
    <script type="text/javascript"> 
     $.ajax({ 
      url: "security/roles", 
      success: function(roles) { 
       $("#menu li[data-roles]").filter(function() { 
        var requiredRoles = (this.attr("data-roles") || "").split(","); 
        for (var requiredRole in requiredRoles) { 
         if (roles.indexOf(requiredRole) >= 0) { 
          return false; 
         } 
        } 

        return true; 
       }).remove(); 

       // TODO call your menu plugin here 
       // $("#menu").superfish(); 
      }, 
      error: function() { 
       $("#menu li[data-roles]").remove(); 
      } 
     }); 
    </script> 

干杯, 院长