2009-09-01 20 views
4

我正在使用CatalystCatalyst::Plugin::AuthenticationCatalyst::Plugin::Authorization::Roles我想知道是否有更好的 方法来添加属性到我没有看到的模型。从模型进行Catalyst调用?

每个用户都被允许访问一个或多个公司,但始终有一个主要(当前)公司是 。允许的列表是 存储在数据库中,并且数据库访问主要通过DBIC

我的第一个倾向是说,它是具有当前 公司的用户,从而把它作为用户模型的一部分:给用户 包“sub company { … }”获取/设置用户当前的公司。数据库检查相当简单;只需使用“$self->search_related”(由用户模型继承的DBIC 方法)。

我在跑的问题是:

  • 目前公司需要请求之间持续存在,但我宁愿不 其存储到数据库(它应该只坚持了这个 会话)。自然的地方是会话...
  • 有一个角色,类似于Unix的root,它允许你扮演 任何公司,忽略数据库中的列表。检查这个角色 可以通过数据库完成,但在应用程序的其他地方使用 $c->assert_user_role和朋友。

我听说尽最大努力保持模型独立于催化剂,因为 可能。有一个模型操纵 $c->session似乎也很奇怪。

当然,我可以移动这些检查控制器,并有 模型接受任何控制器发送,但是这违反干 很严重,只是乞求一个安全问题,如果我忘记 一个支票某处。

有什么建议吗?或者我只是耸耸肩,继续在模型中做?

谢谢,并为标题道歉,我不能拿出一个好。

+1

@Brad Gilbert:感谢链接。 – derobert

+1

我总是这样做,当我遇到可以使用它们的帖子时。 –

回答

2

关键是为每个请求创建一个模型类的实例,然后传递你需要的部分请求。在这种情况下,您可能想要传入基本结果集。您的模型将通过$self->resultset->...进行所有数据库调用,并且它将“为当前用户工作”。 (如果当前用户是root用户,那么你只需通过$schema->resultset("Foo")。如果当前用户是其他人,则通过$schema->resultset("Foo")->stuff_that_can_be_seen_by($c->user)。然后你的模型不再在意)。

我有一些关于此的幻灯片,但它们是非常过时:

http://www.jrock.us/doqueue-grr/slide95c.html#end

(即将进行之前看到的东西后,也。)

请注意,受限制的结果集和Web ACL是正交的。您希望尽可能使模型更加紧凑(以便您的应用程序不会意外地执行您不想要的操作,即使代码所示),但各种仅限Web的细节仍然需要编码访问控制列表。 (“你不被允许查看这个页面”不同于“你只能删除你自己的对象,不是每个人的”。ACL处理第一种情况,受限结果集处理第二种情况,即使你写$rs->delete,由于结果集是有限制的,你并没有删除数据库中的所有内容,只删除了你有权删除的东西,方便!)

+0

不幸的是,stuff_that_can_be_seen_by()是不平凡的,不是结果集。但是,您的幻灯片确实给出了另一个答案:将模型分成两部分,独立于Catalyst的部分和依赖于Catalyst的部分,然后传递所有非平凡的东西并不是那么糟糕,因为它只在一个地方。 – derobert