【问题标题】:The best method for secure page for user in Symfony?Symfony 中用户安全页面的最佳方法是什么?
【发布时间】:2012-04-27 08:35:58
【问题描述】:

我在数据库中有例如表​​:

News:
id | user_id | title | body

和 CRUD:

public function executeIndex(sfWebRequest $request)
public function executeNew(sfWebRequest $request)
public function executeShow(sfWebRequest $request)
public function executeCreate(sfWebRequest $request)
public function executeEdit(sfWebRequest $request)
public function executeUpdate(sfWebRequest $request)
public function executeDelete(sfWebRequest $request)
protected function processForm(sfWebRequest $request, sfForm $form)

如何确保这一点的最佳方法? 我希望用户只能编辑、更新删除拥有新闻。 我可以做到这一点 - 获取当前 ID 用户并与来自新闻和下一个重定向的 user_id 进行比较。也许我可以用 preExecute 或 yaml 文件来做这个?

【问题讨论】:

  • 只创建自己的新闻?这听起来不对……或者任何人都只能创建或授权用户,或者一些子用户。
  • 抱歉 - 更新而不是创建

标签: php symfony1 symfony-1.4


【解决方案1】:

我曾经做过这样的事情。

我选择使用can($what, Doctrine_Record $with)方法扩展User类(应用程序li​​b目录中的myUser.class.php),还声明了几种更新类型,如:const UPDATE = 'update';等,以同样的方式。

preExecute() 之后,我检索了当前请求的对象,在您的情况下 - News 对象,并调用 if (!$this->getUser()->can(myUser::UPDATE, $news)) { /* redirect or whatever */ }

如您所见,它非常易于阅读和维护。

这样您就可以将所有访问逻辑集中在一个方法 - can() 中,您可以在其中指定您需要的任何逻辑。

希望对你有帮助。

对于您的示例,can() 方法类似于:

switch(get_class($with))
{
    case 'News':
        if ($with->getUserId() != $this->getProfile()->getId()) // Assuming that getProfile() gives me a User class which News record is referenced
        {
            switch ($what)
            {
                case self::UPDATE:
                    return false;
                case self::DELETE:
                    return false;
            }
        }
        else
        {
            return true; // The user is owner - he can do whatever he want.
        }
        break;
    default:
        return false; // or true, don't know what you need
}

【讨论】:

  • 我认为你应该反转 can 的参数(在函数或调用中)
  • 好的,我找到了更好的解决方案,请更新您的问题。提前致谢。
【解决方案2】:

我也做了很多相同的事情。但我没有扩展 sfUser 类。我使用了 symfony 的过滤器链http://www.symfony-project.org/book/1_2/06-Inside-the-Controller-Layer#chapter_06_filters 并编写了我自己的能够解析路由配置的 SecurityFilter。

我在 routing.yml 的特定路由中添加了一个选项

contact_list:
  url: /contacts/:usergroup
  param: { module: contacts, action: index }
    options: { securityManager: UsergroupListSecurityManager }

例如:securityFilter 现在使用 UsergroupListSecurityManager 的实例来确定是否允许显示页面。

所以我能够设置默认的“securityManager”并在特定路由上定义任何特定的“securityManagers”——我还能够在不同的路由和其他上下文中重用一些“securityManager”(创建上下文菜单或工具栏)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-05
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多