2 回答

TA貢獻1802條經驗 獲得超10個贊
您必須更改您的防護身份驗證器 AppBundle\Security\LoginFormAuthenticator
這向警衛解釋您只需要檢查登錄頁面上的憑據
public function supports(Request $request){ return 'login_route' === $request->attributes->get('_route') && $request->isMethod('POST'); }

TA貢獻1842條經驗 獲得超13個贊
我的同事找出了問題所在。實際上上面的代碼有很多問題。
使用 GuardAuthenticator 接口已從 sf4 中刪除: https://github.com/symfony/symfony/blob/4.4/UPGRADE-4.0.md#security
logout_on_user_change 不是必需的
不需要 LoginFormAuthenticator。
stateless: true 是防火墻中的錯誤設置,但當我刪除它時,它會拋出先前的錯誤:“無法刷新令牌,因為用戶已更改。嘗試刷新令牌后,令牌已取消身份驗證?!?nbsp;這件事發生是因為
在 isEqualTo 中我檢查了
$this->salt !== $user->getSalt()
但它沒有序列化
所以工作解決方案看起來像這樣
路由是一樣的
后端控制器是相同的
LoginFormAuthentication.php 已刪除
安全.yml
security:
encoders:
AppBundle\Entity\User:
algorithm: bcrypt
cost: 12
providers:
user_provider:
entity:
class: AppBundle:User
property: email
firewalls:
dev:
pattern: ^/(_(profiler|wdt|error)|css|images|js)/
security: false
main:
anonymous: ~
provider: user_provider
form_login:
login_path: app_login
check_path: app_login
default_target_path: app_admin
logout:
path: app_logout
access_control:
- { path: ^/admin, roles: ROLE_ADMIN }
- { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY }
用戶.php
class User implements UserInterface, \Serializable, EquatableInterface
{
// ..
public function serialize()
{
return serialize(array(
$this->id,
$this->email,
$this->password,
$this->salt,
));
}
public function unserialize($serialized)
{
list (
$this->id,
$this->email,
$this->password,
$this->salt
) = unserialize($serialized, array('allowed_classes' => false));
}
public function isEqualTo(UserInterface $user)
{
if (!$user instanceof User) {
return false;
}
if ($user->getId() == $this->getId()) {
return true;
}
if ($this->password !== $user->getPassword()) {
return false;
}
if ($this->salt !== $user->getSalt()) {
return false;
}
if ($this->email !== $user->getUsername()) {
return false;
}
return true;
}
}
- 2 回答
- 0 關注
- 152 瀏覽
添加回答
舉報