我想根据角色设置菜单。我已经制作了一个模型来检查我的角色,并根据我构建我的菜单。
我有不同的控制器和动作,例如:
/ProjectTest/Reports/Projects
/ProjectTest/Admin/Client
/ProjectTest/Admin/Resource
/ProjectTest/portfolio/Schedule
如何确保当用户输入上述任何一个url时,它会命中我检查角色的模型?
答案 0 :(得分:2)
实施您自己的RoleProvider,然后使用AuthorizeAttribute
装饰您的操作。
如果您创建一个继承自RoleProvider
的类,并且仅提供string[] GetRolesForUser(string username)
的实际实现,这就足够了。您的实现应该检查您的模型以找出用户所处的“角色”并将其作为字符串数组返回。
例如
public override string[] GetRolesForUser(string username)
{
// if model says user is in Admin and ReportViewer roles
return new[] {"Admin", "ReportViewer"};
// else return other roles
return new[] { "User" };
}
然后,您希望限制给定角色中的用户的任何操作或控制器都使用AuthorizeAttribute
进行装饰。
e.g。
[Authorize("Admin")]
public class AdminController
{
... etc...
public class ReportController {
[Authorize("ReportViewer"]
public ActionResult Client()
{
...etc...
答案 1 :(得分:1)
您可以做的一件事是创建一个所有“基于菜单”的页面都使用的共享布局页面。此共享页面可以强烈键入您的角色模型,这样您就可以在加载页面内容之前检查用户是谁以及他们的权限。
我不确定你的模型如何处理角色,但是从那里你可以将东西放入视图包,生成一些chump html等,以便你的页面知道要加载的菜单。