77

ここでは、Symfony2 ベースの Web サイトの twig テンプレート内でユーザーのログイン ステータスを確認する方法を読みました。ただし、ユーザーがコントローラー内からログインしているかどうかを確認する方法を知る必要があります。次のコードが正しいと確信していました。

$user = $this->get('security.context')->getToken()->getUser();

ただし、ログインしたユーザーや匿名ユーザーなど、常に何かを返します。

何か案が?前もって感謝します。

4

7 に答える 7

153

警告'IS_AUTHENTICATED_FULLY':ユーザーが "Remember me" 機能を使用してログインしている場合、単独でチェックすると false が返されます。

Symfony 2 のドキュメントによると、3 つの可能性があります。

IS_AUTHENTICATED_ANONYMOUSLY - サイトのファイアウォールで保護された部分にいるが、実際にはログインしていないユーザーに自動的に割り当てられます。これは、匿名アクセスが許可されている場合にのみ可能です。

IS_AUTHENTICATED_REMEMBERED - 記憶 Cookie によって認証されたユーザーに自動的に割り当てられます。

IS_AUTHENTICATED_FULLY - 現在のセッション中にログインの詳細を提供したユーザーに自動的に割り当てられます。

これらの役割は、次の 3 つのレベルの認証を表します。

あなたにIS_AUTHENTICATED_REMEMBERED役割があるなら、あなたにもIS_AUTHENTICATED_ANONYMOUSLY役割があります。ロールを持っている場合 IS_AUTHENTICATED_FULLYは、他の 2 つのロールも持っています。つまり、これらの役割は、認証の「強度」が高まる 3 つのレベルを表しています。

「Remember Me」機能を使用したシステムのユーザーが、'IS_AUTHENTICATED_FULLY'.

答えは、完全に認証されていない場合は再ログインを要求するか、記憶されている役割を確認することです。

$securityContext = $this->container->get('security.authorization_checker');
if ($securityContext->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
    // authenticated REMEMBERED, FULLY will imply REMEMBERED (NON anonymous)
}

うまくいけば、これで誰かが私と同じ間違いを犯すのを防ぐことができます. 誰かが Symfony 2 にログインしているかどうかを確認する方法を調べるときに、この投稿を参考にしました。

ソース: http://symfony.com/doc/2.3/cookbook/security/remember_me.html#forcing-the-user-to-re-authenticate-before-accessing-certain-resources

于 2012-10-20T01:16:00.970 に答える
56

SecurityContext は廃止予定Symfony 3.0

Symfony 2.6あなたが使用する前にSecurityContext。を優先して
SecurityContext非推奨になります。 Symfony 3.0AuthorizationChecker

Symfony 2.6+Symfony 3.0使用するAuthorizationChecker


Symfony 2.6 (およびそれ以下)

// Get our Security Context Object - [deprecated in 3.0]
$security_context = $this->get('security.context');
# e.g: $security_context->isGranted('ROLE_ADMIN');

// Get our Token (representing the currently logged in user)
$security_token = $security_context->getToken();
# e.g: $security_token->getUser();
# e.g: $security_token->isAuthenticated();
# [Careful]             ^ "Anonymous users are technically authenticated"

// Get our user from that security_token
$user = $security_token->getUser();
# e.g: $user->getEmail(); $user->isSuperAdmin(); $user->hasRole();

// Check for Roles on the $security_context
$isRoleAdmin = $security_context->isGranted('ROLE_ADMIN');
# e.g: (bool) true/false

Symfony 3.0+ (および Symfony 2.6+ から)

security.contextになりsecurity.authorization_checkerます。代わりに
からトークンを取得します。security.token_storagesecurity.context

// [New 3.0] Get our "authorization_checker" Object
$auth_checker = $this->get('security.authorization_checker');
# e.g: $auth_checker->isGranted('ROLE_ADMIN');

// Get our Token (representing the currently logged in user)
// [New 3.0] Get the `token_storage` object (instead of calling upon `security.context`)
$token = $this->get('security.token_storage')->getToken();
# e.g: $token->getUser();
# e.g: $token->isAuthenticated();
# [Careful]            ^ "Anonymous users are technically authenticated"

// Get our user from that token
$user = $token->getUser();
# e.g (w/ FOSUserBundle): $user->getEmail(); $user->isSuperAdmin(); $user->hasRole();

// [New 3.0] Check for Roles on the $auth_checker
$isRoleAdmin = $auth_checker->isGranted('ROLE_ADMIN');
// e.g: (bool) true/false

詳細はこちらのドキュメントを参照してください: How to do this in twig?: Symfony 2: How do I check if a user is not logged in a template?AuthorizationChecker

于 2015-08-06T21:34:03.343 に答える
46

これを試して:

if( $this->container->get('security.context')->isGranted('IS_AUTHENTICATED_FULLY') ){
    // authenticated (NON anonymous)
}

さらに詳しい情報:

「匿名ユーザーは技術的に認証されています。つまり、匿名ユーザー オブジェクトの isAuthenticated() メソッドは true を返します。ユーザーが実際に認証されているかどうかを確認するには、IS_AUTHENTICATED_FULLY ロールを確認してください。」

ソース: http://symfony.com/doc/current/book/security.html

于 2012-04-22T20:05:21.577 に答える
1

から拡張し、baseControllerいくつかの基本関数を実装することをお勧めします。ユーザー インスタンスが null であるかどうかをチェックする関数を実装しUserinterfaceます。

/**

*/
class BaseController extends AbstractController
{

    /**
     * @return User

     */
    protected function getUser(): ?User
    {
        return parent::getUser();
    }

    /**
     * @return bool
     */
    protected function isUserLoggedIn(): bool
    {
        return $this->getUser() instanceof User;
    }
}
于 2021-01-15T19:31:54.143 に答える