我尝试配置防火墙以验证用户 . 此步骤工作正常,因为当我在登录表单中放入错误的用户时,应用程序返回消息“Bad credentials . ”,但是当用户和密码正确时,应用程序尝试获取用户角色失败 .
我的实体用户名为“Usuario”,我的实体Rol称为“Perfil” . 在我的用户实体中有这样的代码:
/**
* @ORM\ManyToMany(targetEntity="AppsManantiales\CommonBundle\Entity\Perfil")
* @ORM\JoinTable(name="usuarios_perfiles",
* joinColumns={@ORM\JoinColumn(name="idUsuario", referencedColumnName="idusuario")},
* inverseJoinColumns={@ORM\JoinColumn(name="idPerfil", referencedColumnName="idperfil")}
* )
*/
protected $perfiles;
/**
* Get perfiles (getter auto generated)
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getPerfiles()
{
return $this->perfiles;
}
/**
* Hook method
*/
public function getRoles() {
return $this->getPerfiles()->toArray();
}
登录过程失败,显示以下消息:
错误:在非对象上调用成员函数getRole()
在这个文件中:
/vendor/symfony/symfony/src/Symfony/Bundle/SecurityBundle/DataCollector/SecurityDataCollector.php第60行
所以,检查引用的行:
array_map(function($ role){return $ role-> getRole();},$ token-> getRoles()),
并且,使用var_dump进行调试:
var_dump($token->isAuthenticated());
var_dump($token->getUsername());
最后一行,返回正确的数据,但是当试试这个时:
var_dump($token->getRoles());
var_dump显示包含错误数据的数组:
array(size = 2)0 => string'ccraig'(length = 6)1 => int 3
'ccraig'字符串是实际用户实体实例的值,但另一个值不知道 . 显然,这个值不理解我的Perfil(Rol)实体的“getRole”方法 .
那么,为什么不获得真正的角色阵列呢?我在其他控制器(使用相同的用户)中测试getRoles方法工作正常:
$doctrine = $this->getDoctrine();
$users = $doctrine->getRepository('CommonBundle:Usuario');
$user = $users->find(8);
$perfiles = $user->getPerfiles();
$out = $perfiles->getValues();
var_dump($out);
var_dump显示:
array (size=2)
0 =>
object(AppsManantiales\CommonBundle\Entity\Perfil)[405]
protected 'idperfil' => int 3
protected 'nombre' => string 'ROLE_DOCENTE' (length=12)
protected 'administrador' => boolean true
protected 'paginaDefault' => null
1 =>
object(AppsManantiales\CommonBundle\Entity\Perfil)[406]
protected 'idperfil' => int 1
protected 'nombre' => string 'ROLE_ADMIN' (length=10)
protected 'administrador' => boolean true
protected 'paginaDefault' => null
有任何想法吗 ? . 我是最新的Symfony . 谢谢! .
1 回答
解决方案很简单 . 我不应该返回一个数组o Role Object . 我应该返回一个Role name(string)数组 .