【发布时间】:2012-03-20 03:52:18
【问题描述】:
我有多个 symfony2 应用程序,它们共享公共实体,但使用不同的数据库设置。这些数据库中的每一个都有表user、user_role 和role。
问题是:如果存在相同的用户,我希望该用户能够通过访问 www.myproject.com/app1/login 并在将 URL 更改为 /app2/ 以使用现有令牌 仅 登录到 app1在app2 的数据库中(相同的用户名、密码和盐)。 目前它只检查相同的用户名,你必须同意,这很不方便......
我真的看不到 refreshUser() 何时被调用... :-/
所有应用都使用相同的User 和Role 实体和UserRepository。
任何帮助将不胜感激!
用户存储库:
class UserRepository extends EntityRepository implements \Symfony\Component\Security\Core\User\UserProviderInterface{
/** @var User */
private $user;
public function loadUserByUsername($username) {
/** @var $Q \Doctrine\ORM\Query */
$Q = $this->getEntityManager()
->createQuery('SELECT u FROM CommonsBundle:User u WHERE u.username = :username')
->setParameters(array(
'username' => $username
));
$user = $Q->getOneOrNullResult();
if ( $user == null ){
throw new UsernameNotFoundException("");
}
return $this->user = $user;
}
public function refreshUser(UserInterface $user) {
return $this->loadUserByUsername($user->getUsername());
}
public function supportsClass($class) {
return $class === 'CommonsBundle\Entity\User';
}
public function findById($id){
return $this->getEntityManager()
->createQuery('SELECT u FROM CommonsBundle:User u WHERE u.id = :id')
->setParameters(array(
'id' => $id
))
->getOneOrNullResult();
}
}
User#equals(UserInterface):
我知道有一个更漂亮的方法来编写这个方法,但我会在看到这个工作后重写它:)
public function equals(UserInterface $user)
{
if (!$user instanceof User) {
return false;
}
if ($this->password !== $user->getPassword()) {
return false;
}
if ($this->getSalt() !== $user->getSalt()) {
return false;
}
if ($this->username !== $user->getUsername()) {
return false;
}
return true;
}
【问题讨论】: