在webapp中建模用户约束的最佳实践?

时间:2009-10-26 09:28:21

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

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

让我们考虑一个例子:

  

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

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

谢谢。

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

修改2

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

感谢您的所有建议!

5 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

在问自己之前,Acegi(或规则引擎等)是正确的做法,我认为你需要 准确,完整地分析您的需求

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

满足您需求的模型示例:

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

此示例有许多含义,在您的情况下可能是正确的或不可接受的 影响:

  • 更新号码后,会立即更改限制。
  • 没有每周限制的记忆,你不能问这个过去(例如做统计)
  • ...

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

答案 2 :(得分: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)

答案 3 :(得分:0)

答案 4 :(得分:0)

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