19

私のルート/booking/(.*)がsecurity.ymlのファイアウォール構成によって保護されており、 「 ROLE_USER 」が必要だとします。ユーザーが「 /booking/ 」で始まるルートにアクセスしようとすると、アプリはユーザーをログインにリダイレクトします。認証用のページ。

だから私の質問は、ユーザーが自分の資格情報を提供して認証された後、Symfony 2 はどのようにしてユーザーをページ/ルートにリダイレクトできるのか、または Symfony 2 はそのルートをどこに保存しますか?何処か別の場所。

私たちはそれにアクセスできますか?

4

4 に答える 4

11

キャリー・ケンドールのソリューションはうまくいきました、ありがとう!

Symfony での完全な実装は次のとおりです。

services.yml:

login_handler:
    class: Project\BaseBundle\Service\loginHandler
    arguments: ['@router', '@doctrine.orm.entity_manager', '@service_container']

Project\BaseBundle\Service\loginHandler 内:

namespace Project\BaseBundle\Service;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface;
use Symfony\Component\Routing\RouterInterface;
use Doctrine\ORM\EntityManager;


class loginHandler implements AuthenticationSuccessHandlerInterface {

    private $router;
    private $container;
    private static $key;

    public function __construct(RouterInterface $router, EntityManager $em, $container) {

        self::$key = '_security.secured_area.target_path';

        $this->router = $router;
        $this->em = $em;
        $this->session = $container->get('session');

    }

    public function onAuthenticationSuccess( Request $request, TokenInterface $token ) {

        $user_entity = $token->getUser();

        if( !$user_entity->getChangePassword() ) {

            $route = $this->router->generate('BaseBundle_home_page');

        } else {

            $this->session->getFlashBag()->add('error', 'Your password must be changed now');

            $route = $this->router->generate('BaseBundle_account_page');

        }

        //check if the referer session key has been set
        if ($this->session->has( self::$key )) {

            //set the url based on the link they were trying to access before being authenticated
            $route = $this->session->get( self::$key );

            //remove the session key
            $this->session->remove( self::$key );
            //if the referer key was never set, redirect to a default route

        } else{

            $url = $this->generateUrl('BaseBundle_home_page');

            return new RedirectResponse($route);

        }

        return new RedirectResponse($route);

    }
}
于 2013-11-14T15:08:20.487 に答える
3

symfony はHTTP Referer ヘッダーを使用して、ユーザーを元のページにリダイレクトします。つまり、リファラー

これは、security.yml のセキュリティ構成を使用して設定できますuse_referer: true詳細はこちら

以下を使用して、コントローラーからリファラーヘッダーにアクセスできます。

$referer = $request->headers->get('referer');

ヘッダーのスペルが間違っていることに注意してください。そのリファラー (1 つの r)

于 2013-04-18T10:19:13.523 に答える