【发布时间】:2009-05-20 22:40:55
【问题描述】:
我正在构建一个系统,它似乎需要一些复杂的规则,而不是在整个系统中包含一堆乱七八糟的规则。我希望集中处理这个过程。 (这可能不是我有过的最聪明的想法)
我最(也许最不)绝妙的想法是使用一个单独的类来检查任何对象,然后再根据各个字段中允许的值列表保存到数据库中。它与数据库结构的绑定非常紧密,但很容易测试和维护。
规则示例:
- 版主可以提交具有版主身份的 cmets,但不能提交管理员身份。
- Comments.status 只能是普通或版主(admin 为管理员保留)
- 用户不能在 cmets 上修改主持人值
- Comments.status只能正常,Comments.display只能正常
- 只有版主可以暂停用户帐户
- 众多字段列表
- 只有版主才能修改其他用户帐户
- 限制哪些字段有逻辑判断当前用户是否拥有该行
- 只有拥有付费帐户的用户才能执行 X、Y 和 Z。
我遇到的问题是我将这个逻辑放在哪里。对于 Rails 验证来说,它变得太复杂了。如果我只查看登录用户的状态,实施其中一些规则是困难的或不可能的。当前的解决方案是创建一个 Security 类,该类将接受一个数据库对象和一个用户,并允许或禁止该操作发生。
如果我遵循这种做法,实施将会很糟糕。现在我正在看这样的东西
#For every field on an object passed to Security::allow?(user, object), call this private method
def allow_helper?(user, object, field)
perm = permissions[user.rank][object.class.name][field]
if perm.is_a? Array
perm.include? object.send(field)
else
perm
这将很快成为维护的噩梦。必须有一个替代我梦寐以求的噩梦的方法。我在编码之前停下了自己。
【问题讨论】:
-
可能有助于解释为什么这对于验证来说太复杂了,这似乎是显而易见的答案。
-
我想我觉得使用安全验证会混合我不想混合的逻辑。也许这不是我认为的问题。
标签: ruby-on-rails security model-view-controller