从模型中调用Catalyst?

时间:2009-09-01 14:29:27

标签: perl oop authentication authorization catalyst

我正在使用CatalystCatalyst::Plugin::Authentication Catalyst::Plugin::Authorization::Roles我想知道是否有更好的 将属性添加到我没有看到的模型的方法。

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

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

我遇到的问题是:

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

我听说最好将模型保持为独立于Catalyst的模式 可能。进行模型操作似乎也很奇怪 $c->session

当然,我可以将这些检查移动到控制器上,并且可以使用 model接受控制器发送的任何内容,但这违反了DRY 如果我忘了其中之一,那就是乞求安全问题 检查某处。

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

谢谢,并为标题道歉,我无法想出一个好的。

1 个答案:

答案 0 :(得分: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是正交的。你想让模型尽可能地紧密(这样你的应用程序就不会意外地做你不想要的事情,即使代码说的也是这样),但是仍然需要编写各种仅限网络的详细信息访问控制列表。 (“你不能查看这个页面。”不同于“你只能删除你自己的对象,而不是每个人都有。”ACL处理第一种情况,受限制的结果集处理第二种情况。即使你写{{1}因为结果集是受限制的,所以你没有删除数据库中的所有内容。你只删除了你有权删除的内容。方便!)