2

Symfony2 で非常に基本的な認証を実装しようとしています。ここにコードの主要部分がありますが、実際には問題はありません

完全な security.yml を編集

jms_security_extra:
    secure_all_services: false
    expressions: true

security:
    encoders:
        Symfony\Component\Security\Core\User\User: plaintext

    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]

    providers:
        in_memory:
            memory:
                users:
                    user:  { password: userpass, roles: [ 'ROLE_USER' ] }
                    admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] }

    firewalls:
        login:
            pattern:    ^/login
            anonymous: ~

        secured_area:
            pattern:    ^/
            stateless:  true
            form_login:
                login_path:  /login
                check_path:  /login_check

    access_control:
        - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/, roles: ROLE_USER }    

これは正常に機能し、匿名ユーザーは常に loginAction コントローラーにリダイレクトされます。

編集 ここに完全なコードがあります

<?php

namespace AcmeBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;

class SecurityController extends Controller {

    public function loginAction() {

        $providerKey = 'secured_area';
        $token = new UsernamePasswordToken('test', 'test', $providerKey, array('ROLE_USER'));
        $this->container->get('security.context')->setToken($token);

        return $this->redirect($this->generateUrl('fronthomepage'));

    }
}

問題はありません。匿名ユーザーはloginActionにリダイレクトされ、認証済みユーザーが作成され、トークンに保存され、認証済みユーザーとして保護された領域にリダイレクトされます。残念ながら、私のコードは、セキュリティ ファイアウォールがユーザーを認証済みとして受け入れないように見えるリダイレクト ループで終了します。何か問題はありますか?

4

2 に答える 2

0

さて、コントローラーの仕事はフォームをレンダリングすることであり、セキュリティ コンテキストを設定することではありません。Symfony2 セキュリティ ファイアウォールが自動的にそれを行います。独自のカスタム認証を構築する場合を除き、これを処理する必要はありません。

つまり、あなたの仕事は、ログイン フォームと発生した可能性のあるログイン エラーを表示することですが、セキュリティ システム自体が、送信されたユーザー名とパスワードのチェックとユーザーの認証を処理します。

明確なイメージについては、このドキュメントをお読みください。

ユーザーがログインしたときにカスタム処理を行いたい場合、Symfony2 では、ユーザーがログインに成功した後に起動するイベント リスナーを追加する必要があります。起動されるイベントはsecurity.interactive_login、それにフックするために、services.ymlバンドルResources/configディレクトリからファイルを作成します。

于 2013-03-25T07:46:30.137 に答える
0

認証済みユーザーを設定する前に、実際のユーザー オブジェクトが必要であることを確認してください。私はこのようなことをしました:

class BaseController

protected function setUser($userName)
{
    if (is_object($userName)) $user = $userName;
    else
    {
        $userProvider = $this->get('zayso_core.user.provider');
        // Need try/catch here
        $user = $userProvider->loadUserByUsername($userName);
    }
    $providerKey = 'secured_area';
    $providerKey = $this->container->getParameter('zayso_core.provider.key'); // secured_area

    $token = new UsernamePasswordToken($user, null, $providerKey, $user->getRoles());
    $this->get('security.context')->setToken($token);
    return $user;
}

ただし、このようなことを行うと、セキュリティ システムの大部分がバイパスされるため、お勧めできません。また、サードパーティの認証システム (Janrain) も使用したいと考えていました。私は認証システムを調べましたが、最初は表も裏もわかりませんでした。これはクックブックのエントリが存在する前のことです。

やり過ぎのように思えることはわかっていますが、物事に取り組むと、より理にかなっています。また、多数の気の利いたセキュリティ機能にアクセスできます。認証システムを理解し始めるのにかなりの時間がかかりましたが、最終的にはそれだけの価値がありました.

ヒント: 1. クック ブックを逆方向に進めます。何が起こっているのか理解するのに非常に苦労しましたが、新しいファイアウォールを security.yml に追加することから始め、次にセキュリティ ファクトリのエイリアスを追加しました。次に、工場が何を求められているかをたどりました。そこからリスナーを起動させ、呼び出しを再びトレースしました。最後に、認証マネージャーが登場します。繰り返しますが、時間がかかりますが、最終的にはそれだけの価値があります。多くを学んだ。

  1. 私を夢中にさせたのは、クラスがあちこちに散らばっていることです。そして、ネーミングには何かが望まれます。概要を把握するのは非常に困難です。私は最終的に独自の認証バンドルを作成し、すべてをセキュリティ下に置きました。

  2. 動作するバンドルの別の例が必要な場合は、https ://github.com/cerad/cerad/tree/master/src/Cerad/Bundle/JanrainBundle をご覧ください。

于 2013-03-26T15:44:13.530 に答える