我正在使用Catalyst和Catalyst::Plugin::Authentication
Catalyst::Plugin::Authorization::Roles
我想知道是否有更好的
将属性添加到我没有看到的模型的方法。
允许每个用户访问一个或多个公司,但有
每次都是一家主要(当前)公司。允许的列表是
存储在数据库中,数据库访问主要通过DBIC
。
我的第一个倾向是说用户是有电流的
公司,因而把它作为用户模型的一部分:给用户
打包“sub company { … }
”以获取/设置用户的当前公司。该
数据库检查相当容易;只需使用“$self->search_related
”(DBIC
方法,由用户模型继承。)
我遇到的问题是:
root
,允许你扮演
任何公司,忽略数据库中的列表。检查此角色
可以通过数据库完成,但应用程序中的其他地方都使用
$c->assert_user_role
和朋友们。我听说最好将模型保持为独立于Catalyst的模式
可能。进行模型操作似乎也很奇怪
$c->session
。
当然,我可以将这些检查移动到控制器上,并且可以使用 model接受控制器发送的任何内容,但这违反了DRY 如果我忘了其中之一,那就是乞求安全问题 检查某处。
有什么建议吗?或者我只是耸耸肩,继续在模型中做到这一点?
谢谢,并为标题道歉,我无法想出一个好的。
答案 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}因为结果集是受限制的,所以你没有删除数据库中的所有内容。你只删除了你有权删除的内容。方便!)