根据记录的用户凭据分配组

时间:2013-06-06 15:49:55

标签: permissions symfony1 symfony-1.4 sfguard sfdoctrineguard

我正在使用sfDoctrineGuardPlugin和Symfony 1.4.20开发应用程序然后我有三个用户和三个用户组以及一些权限如下:

user_name         user_group      permissions
u1                Group1          can_admin_full, can_admin
u2                Group2          can_admin
u3                Group3          no_admin

因此 u1 应该能够将用户添加到应用程序,但只能看到“群组选项”下的“群组2”和“群组3”, u2 应该能够将用户添加到应用程序中但只能在Groups Options下看到Group3,所以u1和u2不应该添加属于Group1的用户,我怎么能用sfDoctrineGuard来获取它?有可能吗?

注意:我使用GroupN作为示例,但代码示例中的下方是组和权限的正确名称!

编辑:改善问题 所以在仔细研究this之后我会尝试相同但适应我的代码,所以在lib/form/doctrine/sfDoctrineGuardPlugin/sfGuardUserForm.class.php我改变了这个:

class sfGuardUserForm extends PluginsfGuardUserForm {

    public function configure() {
        //groups_list
        $this->getWidget('groups_list')->setOption('expanded', true);
        $this->getWidget('groups_list')->setOption('table_method', 'getListForAdmin');
        $this->getValidator('groups_list')->setOption('query', Doctrine::getTable('sfGuardGroup')->getListForAdmin());
    }

}

我也在lib/model/doctrine/sfDoctrineGuardPlugin/sfGuardGroupTable.class.php

进行了此更改
class sfGuardGroupTable extends PluginsfGuardGroupTable {

    /**
     * Returns an instance of this class.
     *
     * @return object sfGuardGroupTable
     */
    public static function getInstance() {
        return Doctrine_Core::getTable('sfGuardGroup');
    }

    /**
     * Builds list query based on credentials
     *
     */
    public function getListForAdmin() {
        $user = sfContext::getInstance()->getUser();
        $q = $this->createQuery('g');

        if ($user->hasPermissions('can_admin_full')) {
            $q->addWhere('g.name IN (?)', array('Administradores Monitor', 'Monitor'));
        } else if ($user->hasPermissions('can_admin')) {
            $q->addWhere('g.name IN (?)', array('Monitor'));
        }
        return $q;
    }

}

但是不行,因为使用属于“Administrador de Servicios”组的用户登录并拥有权限'can_admin'和'can_admin_full',我可以看到小部件中的所有组,我只是想看看在这种情况下,“Administradores Monitor”和“Monitor”

编辑2 另请尝试使用其他代码:

$this->widgetSchema['groups_list'] = new sfWidgetFormDoctrineChoice(array('multiple' => true, 'table_method' => 'getListForAdmin', 'query' => Doctrine::getTable('sfGuardGroup')->getListForAdmin()));

仍然无效,我将'table_method' => 'getListForAdmin'更改为'table_method' => 'getListForAdmin1'并且没有任何反应,因此我怀疑该方法永远不会被调用

编辑3 现在它正在工作,但看到这个: 如果我使用这种方法:

$this->getWidget('groups_list')->setOption('expanded', true);
$this->getWidget('groups_list')->setOption('table_method', 'getListForAdmin');
$this->getValidator('groups_list')->setOption('query', Doctrine::getTable('sfGuardGroup')->getListForAdmin());

然后我收到此错误:

  

SQLSTATE [HY093]:参数号无效:绑定变量数   与令牌数量不匹配

如果我使用其他方法:

$this->widgetSchema['groups_list'] = new sfWidgetFormDoctrineChoice(array('multiple' => true, 'table_method' => 'getListForAdmin', 'query' => Doctrine::getTable('sfGuardGroup')->getListForAdmin()));

我得到了另一个错误:

  

sfWidgetFormDoctrineChoice需要以下选项:'model'。

然后我添加了参数model

$this->widgetSchema['groups_list'] = new sfWidgetFormDoctrineChoice(array('multiple' => true, 'model' => 'sfGuardGroup', 'table_method' => 'getListForAdmin', 'query' => Doctrine::getTable('sfGuardGroup')->getListForAdmin()));

但是得到与第一种方法相同的错误,我怀疑问题出在getListForAdmin()函数中,但实际上并不知道究竟在哪里

此时出了什么问题?

1 个答案:

答案 0 :(得分:1)

尝试更改getListForAdmin()中的条件:

if ($user->hasPermissions('can_admin_full')) {
        $q->whereIn('g.name', array('Administradores Monitor', 'Monitor'));
    } else if ($user->hasPermissions('can_admin')) {
        $q->whereIn('g.name', array('Monitor'));
    }