13

私は Symfony2 で私を記憶する機能を実装しました。「remember me」ボックスをチェックしてログインすると、「REMEMBERME」という名前の Cookie が作成されます。その Cookie は、ブラウザーを閉じて数時間後に開いた場合にも使用できます。しかし、アプリケーションのホームページをロードすると、Cookie が自動的に削除され、ログインしているユーザーが表示されません。Cookie の削除の理由を説明してもらえますか?

remember_me:
          key:      qwerty
          lifetime: 604800
          path:     /
          domain:   ~ 

これは私のsecurity.ymlファイルのセクションです

編集:私はまだこの質問に対する解決策を見つけていません...

EDIT2:新しい問題が発生しました。REMEMBERME Cookie はまったく設定されません。これを解決するには??

解決済み: 以下の回答を参照してください

4

10 に答える 10

13

この質問はすでに回答されていますが、後世とこの問題の Google 検索の参照のためだけであれば、可能な解決策を提供したいと思います :)

「問題は単純です。記憶されたユーザーには IS_AUTHENTICATED_FULLY ロールがありませんが、IS_AUTHENTICATED_REMEMBERED のみが記憶されたユーザーとログインしたユーザーを区別します」

ソース: http://www.mail-archive.com/symfony-users@googlegroups.com/msg34021.html

つまり、セキュリティ構成では、IS_AUTHENTICATED_FULLY ロールに加えて、すべての ACL エントリに対して IS_AUTHENTICATED_REMEMBERED ロールが構成されていることを確認する必要があります。

例えば:

#app/config/security.yml
security:
    ...
    access_control:
        - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/admin/, role: [IS_AUTHENTICATED_FULLY,IS_AUTHENTICATED_REMEMBERED] }
于 2012-06-11T19:39:11.343 に答える
11

ジョン。

私はあなたと同じ問題を抱えています(またはしました)、私が見つけたのは(Symfony2は実際には=))101行目の/ vendor / symfony / src / Symfony / Component /Security/にREMEMBERMEcookieを設定していることですHttp / RememberMe/TokenBasedRememberMeService.phpファイル$user->getPassword()はNULLを返すため、CookieはNULLのパスワード値で計算されたハッシュを取得します。

次に起こることは、あなたが自動的に認証されることを完全に確信してあなたのサイトに戻ったとき、Symfonyは上記と同じファイルであなたのクッキーをチェックし始めますが、58行目でクッキーハッシュがそれが期待するものと同じではないことがわかります例外をスローします('cookie \のハッシュは無効です。')内部でそれをキャッチし、どこかに進みます。

だから私の場合、クッキーが機能しないのはそのためです。

私はまだ解決策を見つけていませんが、それを掘り下げて、幸運かもしれません。

あなたの問題が同じであり、解決策が私たち両方に役立つことを願っています。

ソリューション:

UserInterfaceからユーザーの機密データを消去するために使用されると主張するeraseCredentials()を実装する場合、$ this-> password=nullを実行しないでください。私はその目的を理解していないので、この間違いを犯しました。少し説明するために、Symfony 2ログアウト(UserInterface :: EraseCredentials)を一瞥することができます。そのため、トークンオブジェクトがシリアル化され、問題が発生します。

于 2012-02-11T11:28:58.800 に答える
1

私はこの問題を抱えていました。問題は、 remember_meセクション (security.yml) のプロパティキーで単一引用符を使用しなかったことです。これを変更します

私を覚えてますか:
    キー: qwerty
    寿命: 604800
    道: /
    ドメイン: ~

これに

私を覚えてますか:
    キー: 'qwerty'
    寿命: 604800
    道: /
    ドメイン: ~


symfony のドキュメントで確認できます:
http://symfony.com/doc/2.7/cookbook/security/remember_me.html

于 2016-02-26T15:14:34.273 に答える
0

セッションの有効期間を延ばしてみてください: (config.yml)

  framework:
    session:
        default_locale: %locale%
        auto_start:     true
        lifetime:       604800
于 2012-01-15T12:51:57.710 に答える
0

私の場合、RedirectResponseドキュメントに従って を返すカスタム ログイン ハンドラを実装しました。これにより、Symfony が標準のログイン ルーチンをバイパスし、REMEMBERMECookie が作成/保存されないことが判明しました。

ログイン ハンドラーを削除し、必要なすべてのロジックを備えたカスタム ログイン リスナーを実装する必要がありました。

ログイン リスナーの実装方法については、こちらを参照してください。

于 2017-01-09T08:31:42.203 に答える
0

私の場合は、userProviderの supportsClass メソッドの実装が間違っていたため、43 行目のTokenBasedRememberMeServiceクラスで例外が発生しました( getUserProviderによってスローされ、他の場所でキャッチされたため、黙って失敗しました)。ドミトリーが示したパスを掘り下げると、問題が解決しました。

于 2013-08-29T23:47:53.407 に答える
0

同じ問題がありました。調査の結果、次のことがわかりました 。エンティティ ユーザー プロバイダーにフィールドを/vendor/symfony/doctrine-bridge/Security/User/EntityUserProvider.php::loadUserByUsername()設定するか、リポジトリにメソッドが実装されている必要があります。propertySymfony\Bridge\Doctrine\Security\User\UserLoaderInterfaceloadUserByUsername()

次のようにプロパティフィールドを追加しました:

providers:
    user_provider:
        entity:
            class: App\Entity\User
            property: email
于 2018-04-27T07:12:12.903 に答える