【问题标题】:Best practices in modelling user constraints in a webapp?在 webapp 中建模用户约束的最佳实践?
【发布时间】:2010-12-10 01:55:19
【问题描述】:

我正在使用 Acegi (Spring) 安全性构建具有基于角色的访问控制的 web 应用程序。所以我有不同的用户角色:ROLE_ADMINROLE_USER 等等。
但是,我需要实现各种用户约束。

让我们考虑一个例子:

假设有一个用户可以在线观看电影的网站。有角色为ROLE_STANDARD_USERROLE_VIP_USER 的用户。标准用户每周可以看 3 部电影,vip 用户可以每周看 10 部电影,还有其他一些特权。标准用户组中有一个用户,我想每周给他额外的 2 部电影。允许的电影数量有时可能会发生变化。
此外,还有各种类型的电影:奇幻、喜剧、经典、新电影等。我希望某些用户,无论其角色如何,都只能访问某些类别。可以动态创建和删除类别。

是否有实施此类用户约束的标准做法?
可以/应该使用 Spring Security 角色和权限来完成吗?
或者我需要考虑为我的应用添加基于规则的引擎?

谢谢。

编辑:
上面的示例是虚构的,我的项目涉及为学生授予对各种网络(和其他)设备的远程访问权限。但是,用户约束的类型可能是相同的。
不幸的是,用户访问和约束的模型并不完整和稳定。在不久的将来,我可能会被告知要为用户实施各种额外的限制,现在还不知道。
因此,我现在想选择一条路径,以便将来轻松添加或更改新的用户约束,并且不需要对内部模型或数据库结构进行重大改革。如果可能的话。

编辑 2

目前,基本的用户约束是硬编码的(原型系统遗留下来的)。我想我会先尝试将它重构为某种参数化的业务服务对象,然后再考虑我可以从那里去哪里。我也会考虑使用 Spring Security Authorization Decision Managers。

感谢您的所有建议!

【问题讨论】:

    标签: java web-applications constraints spring-security rules


    【解决方案1】:

    如果您考虑使用 Spring Security,这是我认为您可以实施解决方案的一种方式。实现AccessDecisionVoter 来决定用户的访问权限。看看参考源here

    同时查看AccessDecisionVoter 的[javadoc][2]。您可以通过实现vote 方法来实现您的规则。

    int vote(Authentication authentication,
             Object object,
             ConfigAttributeDefinition config)
    

    让 Spring 处理访问(身份验证和授权)。如果决策变得复杂,使用规则引擎可能是明智的。让投票方法调用规则引擎。这提供了明确的职责分离。让 Spring Security 处理访问,让规则引擎计算规则。

    [2]:http://static.springsource.org/spring-security/site/apidocs/org/springframework/security/vote/AccessDecisionVoter.html#vote(org.springframework.security.Authentication,java.lang.Object,org.springframework.security.ConfigAttributeDefinition)

    【讨论】:

      【解决方案2】:

      听起来您有身份验证需求和授权需求 - 很多时候人们会混淆和/或加入这两者。值得庆幸的是,Spring Security 很好地描述了这两者。您的用户将通过安全链(形式为 logj、openID、SSL X509)进行身份验证,然后在完成后由您的业务特定选民(在您的 AccessDecisionManagers 中)授权他们是否已经看到他们的分配号码的电影。如果以后需要添加新的业务逻辑,只需编写新的/更多的选民并将它们注入您的经理。

      【讨论】:

        【解决方案3】:
        【解决方案4】:

        我不希望声明性的基于角色的安全系统能够提供您所寻求的细粒度控制。您已经描述了很多您想要实现的基于“业务规则”的访问控制,我们可能期望随着时间的推移这些规则会变得更加复杂。因此,您需要来自安全子系统的信息组合(此请求的用户是谁?他们有什么角色?),然后以编程方式将其与业务数据和规则相结合(如果今天的日期,该用户有权观看 2 部免费电影在这个范围内)。

        至少我会定义封装该业务逻辑的服务。关于是否使用成熟的规则引擎的决定需要进一步研究。

        【讨论】:

        • 换句话说,你必须开始对其进行编程,而不是认为一个神奇的库和一些神奇的配置/咒语可以让它按照你期望的方式工作 =)
        • 可悲的是,当神奇的配置 完成这项工作时,人们常常开始编码:-(
        【解决方案5】:

        在问自己 Acegi(或规则引擎等)是否适合这样做之前,我认为您需要
        准确、完整地分析您的需求

        考虑到每个主题(例如,可以看到的电影的限制),有很多方法可以实现这一点,您需要做出功能选择。除非您已经详细决定要做什么,否则不可能有正确的实施!

        满足您需求的模型示例:

        • 根据总和限制每周一般电影的数量:
          • 角色(3 或 10)
          • 每位用户的奖金(如果未提及,则默认为 0)
        • 根据需要更新这些数字
        • 将电影限制为类别列表:
          • 如果为用户指定了列表,请使用它
          • 否则,请使用为角色提供的列表

        这个例子有很多含义,在你的情况下可能是正确的或不可接受的。
        影响:

        • 更新数字后,限制立即更改。
        • 没有关于每周限制的记忆,你不能问过去(例如做统计)
        • ...

        假设此模型不符合您的需求,您将面临创建真正适合他们的模型的艰巨任务。只有拥有了它,然后再考虑实施。

        【讨论】:

          猜你喜欢
          • 2011-04-02
          • 1970-01-01
          • 2010-10-19
          • 2019-10-22
          • 2020-08-22
          • 2012-03-29
          • 1970-01-01
          • 2013-01-15
          • 1970-01-01
          相关资源
          最近更新 更多