[英]Why is the user redirected to login when already authenticated?
我想在用戶單擊激活鏈接時與他登錄。
在我的AuthController
activationAction
方法中,執行以下操作:
// we log in the member
$repo = $this->getDoctrine()->getRepository("AppBundle:Members\Members");
$user = $repo->loadUserByUsername($username);
//echo dump($user->getRoles());die(); // $user->getRoles() = return array('ROLE_MEMBER');
if (!$user) {
throw new UsernameNotFoundException("User not found");
} else {
$token = new UsernamePasswordToken($user, null, "main", $user->getRoles());
$this->get("security.token_storage")->setToken($token); //now the member is logged in
$event = new InteractiveLoginEvent($request, $token);
$this->get("event_dispatcher")->dispatch("security.interactive_login", $event);
}
這樣,我的用戶就通過我的路線/activation
登錄了
然后,如果我想更改頁面並轉到/members/toto
我的用戶將重定向到我的登錄路徑/login
為什么我的具有ROLE_MEMBER
用戶已經通過身份驗證時被重定向到登錄頁面?
當我在security.yml
文件中注釋以下行- { path: ^/members/, roles: ROLE_MEMBER }
時,不再重定向。
security.yml file
:
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
pattern: ^/
anonymous: true
provider: our_db_provider
form_login:
login_path: login
check_path: login
csrf_token_generator: security.csrf.token_manager
success_handler: app.security.authentication_handler
failure_handler: app.security.authentication_handler
logout:
path: logout
target : /
remember_me:
secret: '%secret%'
lifetime: 604800 # 1 week in seconds
path: /
access_control:
- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
# when I comment the following line I am not redirected anymore.
- { path: ^/members/, roles: ROLE_MEMBER }
尋找最常用的身份驗證方法是Session,Token,因此您有兩種選擇:為用戶設置會話cookie並在會話中存儲用戶,還是強制用戶發送在每個請求中生成的令牌
令牌方法需要您的應用程序客戶端使用JS,因此,如果您的模板是由php生成的,例如,如果您使用樹枝作為模板引擎,則最好使用會話方法。
考慮到http是無狀態協議,因此當用戶向您的服務器請求登錄uri並成功驗證了身份后,一切都不會完成。
如果您正在使用會話php,則會生成一個代碼並將其設置在用戶瀏覽器中,這樣,每次客戶端的瀏覽器想要向您的服務器請求時,它都會發送cookie(生成的代碼),以便您記住用戶。
令牌方法非常相似,但是您應該自己實現從生成令牌到檢查令牌是否存在的所有部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.