繁体   English   中英

在Symfony中为用户提供安全页面的最佳方法?

[英]The best method for secure page for user in Symfony?

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

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)

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

我曾经做过这样的事情。

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

之后,在preExecute()我检索了当前请求的对象(在您的情况下为preExecute()对象),并调用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
}

我做了很多相同的事情。 但是我没有扩展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”-我还能够在不同的路由和其他上下文(创建contextmenu或工具栏)中重用某些“ securityManager”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM