4

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

让我们考虑一个例子:

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

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

谢谢你。

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

编辑 2

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

感谢您的所有建议!

4

5 回答 5

4

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

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

于 2009-10-26T09:55:03.840 回答
1

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

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

满足您需求的模型示例:

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

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

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

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

于 2009-10-26T09:52:58.830 回答
1

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

另请查看 [javadoc][2] for AccessDecisionVoter. 您可以通过实现该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)

于 2009-10-27T04:17:45.367 回答
0

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

于 2009-10-26T17:33:03.593 回答