4

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

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

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

我遇到的问题是:

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

我听说最好让模型尽可能独立于催化剂。让模型进行操作似乎也很奇怪 $c->session

当然,我可以将这些检查移至控制器,并让模型接受控制器发送的任何内容,但这严重违反了 DRY,如果我在某处忘记其中一个检查,则只是乞求安全问题。

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

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

4

1 回答 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。(“您不允许查看此页面。”与“您只能删除自己的对象,而不是每个人的对象”不同。ACL 处理第一种情况,受限结果集处理第二种情况。即使你写$rs->delete了,因为结果集被限制了,你并没有删除数据库中的所有内容。你只删除了你有权删除的东西。方便!)

于 2009-09-01T18:27:07.980 回答