我正在使用 Acegi (Spring) 安全性构建一个具有基于角色的访问控制的 Web 应用程序。所以我有不同的用户角色: ROLE_ADMIN, ROLE_USER 等等。
但是,我需要实施各种用户限制。

让我们考虑一个例子:

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

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

谢谢。

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

编辑2

目前,基本的用户约束是硬编码的(原型系统遗留下来的)。我想我会首先尝试将其重构为某种参数化业务服务对象,然后思考我可以从哪里开始。我还将考虑使用 Spring Security 授权决策管理器。

感谢您的所有建议!

有帮助吗?

解决方案

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

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

其他提示

在问自己 Acegi(或规则引擎等)是执行此操作的正确位置之前,我认为您需要
准确、完整地分析您的需求.

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

的例子 模型 满足您的需求:

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

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

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

假设这个模型不适合您的需求,那么您将面临创建真正适合他们的模型的艰巨任务。只有当你有了它之后,才考虑实施。

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

另请参阅 AccessDecisionVoter 的[javadoc] [2]。您可以通过执行<代码>投票方法实现您的规则。

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

让弹簧处理访问(认证和授权)。如果决策变得复杂,使用规则引擎可能是明智的。让投票方法调用规则引擎。这提供了明确的职责分离。让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)

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top