根据用户角色限制用户控制的功能

Posted

技术标签:

【中文标题】根据用户角色限制用户控制的功能【英文标题】:limit functionality of user control based on the user role 【发布时间】:2012-07-07 16:28:50 【问题描述】:

在 ASP.Net MVC Web 应用程序中创建能够根据用户角色或用户本身限制其功能的用户控件的最佳实践和/或标准是什么?

换句话说,假设我有四个不同的网页,其中 90% 的内容完全相同(一些搜索字段、包含搜索结果的网格、一些 javascript...),每个网页可能有一个或两个其他搜索字段。 (请注意,每个页面上这些额外的搜索字段,对搜索结果都是有效的。另外请考虑我们在后台使用相同的存储过程,并且在搜索字段较少的页面中,我们将空值或默认值(根据情况)传递给它们)。

我们正在寻找一种方法来重构我们的代码,如果可能的话,可以在四个页面中的每一页中使用 USER CONTROL

编辑:也许我应该将问题更正为这样的问题:如何避免将 标签放在视图中并使用类似于here 描述的方法,其中CRice 说:“最好让 viewdata 或 model 来表示视图要显示的内容,而视图可以简单地检查视图数据。一个控制器基类或一个动作上的过滤器可以重复使用这个非常简单和允许代码存在于一个地方。”为了解决我的问题?

人们一直强调检查用户角色部分。事实上,当我问这个问题时,我已经知道这一点。我不知道如何以正确的方式使用视图数据或模型或任何适合此类情况的方法。 (特别是使用reference question中描述的模型)

非常感谢您指导我完成此过程以及您的耐心。

【问题讨论】:

有多种方法可以在应用程序中实现基于角色的访问控制。使用权限属性装饰控制器操作是一种比较常见的做法,但我不知道这是否是最佳做法。 @48klocs 感谢您的回复,我明白了,但我对视图而不是控制器感到好奇。我的意思是如何呈现特定于控制角色的控件? 【参考方案1】:

我们正在寻找一种方法来重构我们的代码,如果可能的话 而是在四个页面中的每个页面中都有一个 USER CONTROL。

这确实是正确的方法。除了在 ASP.NET MVC 中没有用户/服务器端控件。您可以编写一个自定义的可重用 html 帮助器来封装此函数功能,并在您的视图中调用此自定义帮助器。例如:

@Html.RoleBasedTextBoxFor(x => x.SomeField, "Admin")

自定义助手将简单地检查当前经过身份验证的用户是否具有管理员角色并呈现一个文本框,如果不是则返回一个空字符串。

以下是此类示例帮助程序的外观:

public static class HtmlExtensions

    public static IHtmlString RoleBasedTextBoxFor<TModel, TProperty>(
        this HtmlHelper<TModel> html,
        Expression<Func<TModel, TProperty>> expression,
        string roleName
    )
    
        var user = html.ViewContext.HttpContext.User;
        if (!user.Identity.IsAuthenticated || !user.IsInRole(roleName))
        
            // the user is not authenticated or is not in the required role
            return MvcHtmlString.Empty;
        

        return html.TextBoxFor(expression);
    

【讨论】:

谢谢伙计。您能阅读我关于 48klocs 的答案的 cmets 吗?你怎么看? 是的,我读过。你的评论很有道理。您问的是基于角色在视图中创建条件逻辑而不在视图中编写 if 语句,这就是我试图在回答中说明的内容。 是的。达林,你的回答很对。事实上,它是一种将 IF 子句隐藏在辅助方法中的方法,并且是迄今为止最好的。但是我对Crice的答案很好奇。读完之后,在我看来,有一种完全不同的标准方式可以做我不知道的事情!所以我真的很想知道。所以如果你知道他说什么,请告诉我。 是的,另一种可能性是在您的视图模型属性上使用模型元数据,指示如果要显示该属性,用户必须处于的角色。然后覆盖默认的编辑器模板,在渲染字段之前检查用户是否处于此角色。 谢谢。您有任何示例、代码 sn-ps 或任何有用的参考资料吗?【参考方案2】:

如果您想查看视图中的角色,that question has already been answered。

虽然您可以在视图上使用Page.User.IsInRole("RoleName"),但最好有控制器,控制用户流。

【讨论】:

谢谢,但我不知道为什么人们一直强调 check user-in-role 部分;事实上,当我问这个问题时,我已经知道了!我真正的问题是关于如何避免将&lt;% if(...)%&gt; 标签放入其中并使用一些方法,例如您提到的问题中描述的方法,CRice 说:“最好让视图数据或模型表示视图要显示的内容,并且视图可以简单地检查视图数据。控制器基类或操作上的过滤器可以非常简单地重复使用这一点,并允许代码存在于一个地方。” 事实上,您能告诉我如何使用@CRice 描述的方法解决我的问题

以上是关于根据用户角色限制用户控制的功能的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring Security 在我的控制器中获取用户登录的角色

我想根据MVC C#中的用户角色控制视图

如何根据 laravel 中的用户角色管理控制器方法?

005.OpenShift访问控制-权限-角色

对用户的基于角色的访问控制

根据用户角色限制点击按钮