簡體   English   中英

為什么已經通過身份驗證的用戶重定向到登錄名?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM