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

Java 在webapp中建模用户约束的最佳实践?,java,web-applications,constraints,spring-security,rules,Java,Web Applications,Constraints,Spring Security,Rules,我正在使用Acegi(Spring)安全性构建一个基于角色的访问控制的webapp。所以我有不同的角色用户:ROLE\u ADMIN,ROLE\u USER等等 但是,我需要实现各种用户约束 让我们考虑一个例子: 假设有一个网站,用户可以在线观看电影。有角色ROLE\u STANDARD\u USER和ROLE\u VIP\u USER的用户。标准用户每周可以观看3部电影,vip用户每周可以观看10部电影,并拥有其他一些特权。标准用户组中有一个用户,我想每周给他额外2部电影。允许的电影数量有时可

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

让我们考虑一个例子:

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

是否有实施此类用户约束的标准实践?
是否可以/应该使用Spring安全角色和权限完成此操作?
或者我需要考虑在我的应用程序中添加一个基于规则的引擎?

多谢各位

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

编辑2

目前,基本的用户约束是硬编码的(原型系统的遗留部分)。我想我会先尝试将其重构为某种参数化的业务服务对象,然后再考虑从那里可以走到哪里。我也将考虑使用Spring Security授权决策管理器。
谢谢你的建议

在问自己Acegi(或规则引擎等)是做这件事的正确地方之前,我认为你需要
准确、全面地分析您的需求

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

满足您需求的型号的示例:

  • 根据的总和限制每周普通电影的数量:
    • 角色(3或10)
    • 每用户奖金(如果未提及,则默认为0)
  • 根据需要更新这些数字
  • 将电影限制为一系列类别:
    • 如果为用户指定了列表,请使用它
    • 否则,请使用为角色提供的列表
这个例子有很多含义,在您的情况下可能是正确的,也可能是不可接受的。
影响:

  • 更新一个数字后,限制立即更改
  • 没有关于每周限额的记忆,你不能询问过去的情况(例如进行统计)

假设这个模型不适合您的需要,您将面临创建一个真正适合您的模型的艰巨任务。只有在拥有它之后,再考虑实现。

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

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

从这里开始:

访问控制简介:

授权:


需要一点阅读

听起来你有身份验证需要和授权需要——很多时候人们会混淆和/或将两者结合起来。谢天谢地,SpringSecurity很好地描述了两者。您的用户将通过安全链进行身份验证(可以是logj、openID、SSL X509),然后在完成后,由您的业务特定投票者(在您的AccessDecisionManager中)授权他们是否已经看过分配数量的电影。如果以后需要添加新的业务逻辑,只需写下新的/更多的投票者,并将他们注入到您的经理中即可AccessDecisionVoter以决定用户的访问权限。看看参考源

另请查看[javadoc][2]中的
AccessDecisionVoter
。您可以通过实现
投票
方法来实现您的规则

int vote(Authentication authentication,
         Object object,
         ConfigAttributeDefinition config)
让Spring处理访问(身份验证和授权)。如果决策变得复杂,使用规则引擎可能是明智的。让投票方法调用规则引擎。这提供了明确的职责划分。让Spring安全性处理访问,并让规则引擎计算规则


[2] :,java.lang.Object,org.springframework.security.ConfigAttributeDefinition)

换句话说,你应该开始编写它,而不是考虑