2

我们知道授权的东西是一个横切关注点,我们尽我们所能避免在我们的视图中合并业务逻辑。

但是我仍然没有找到一种优雅的方法来使用当前用户角色过滤 UI 组件(例如小部件、表单元素、表格等),而不会用业务逻辑污染视图。这同样适用于模型绑定。


例子

形式:产品创作

领域:

  • 姓名
  • 价格
  • 折扣

角色:

  • 角色管理员

    • 允许查看和修改名称字段
    • 允许查看和修改价格字段
    • 允许查看和修改折扣
  • 角色管理员助理

    • 允许查看和修改名称
    • 允许查看和修改价格

Fields每个角色表现出来的都不一样,也model binding需要忽略discount field'Administrator assistant'这个角色。

你会怎么做?

4

3 回答 3

3

我认为这样做的方法是创建您自己的输入扩展方法版本。例如,TextBox您可以像这样创建TextBoxRoles和定义它:

public static MvcHtmlString TextBoxRoles(
    this HtmlHelper htmlHelper,
    string name,
    string RolesEdit,
    string RolesView
)

然后在代码中它看起来像这样:

<%= Html.TextBoxRoles("Price", "Administrator","Administrator,Assistant") %>

然后,您的实现TextBoxRoles将检查当前用户的角色,User.IsInRole()以确定页面上应显示的内容。

当然,您必须为您使用的每种输入扩展方法执行此操作。

于 2010-04-29T15:19:22.020 回答
1

像 LinFu 这样的 AOP 框架呢?如果它是横切的,那么就声明它是横切的,并将其视为横切。

于 2010-04-29T17:15:59.407 回答
1

由于您已经拥有当前用户和对控制器中授权提供者的访问权限,因此这是他们的理想职责。使用简单的实现,您可以在过滤当前用户可以访问的小部件后将一组小部件传递给您的视图。对于您的表单字段,当您考虑客户端验证时,事情可能会变得棘手。

绑定部分将是最直接的,为这些特殊情况使用自定义绑定器会特别好,因为它可以访问控制器上下文,您可以从那里获取当前用户并根据绑定值你的角色定义。

于 2010-04-29T22:32:27.837 回答