Symfony2自定义Authenticator在未经过身份验证时执行某些操作

时间:2014-01-10 10:49:34

标签: php symfony authentication service

如何管理Full authentication is required to access this resource.? 我想在未经过身份验证时重定向用户。 我有自定义uthenticater根据会话数据验证用户,我想在他没有验证时重定向用户。

我的身份验证员类:

/**
 * @Service("sso_authenticator")
 */
class SsoAuthenticator implements SimplePreAuthenticatorInterface
{

    /**
     * @var SsoUserProvider
     */
    protected $userProvider;

    /**
     * @InjectParams({
     *      "userProvider" = @Inject("sso_user_provider")
     * })
     */
    public function __construct(SsoUserProvider $userProvider)
    {
        $this->userProvider = $userProvider;
    }

    public function createToken(Request $request, $providerKey)
    {
        $user = $request->getSession()->get('sso_user');

        if (!$user) {
            throw new BadCredentialsException('No user found');
        }

        return new PreAuthenticatedToken(
                'anon.', $user, $providerKey
        );
    }

    public function authenticateToken(TokenInterface $token, UserProviderInterface $userProvider, $providerKey)
    {
        $user = $token->getCredentials();
        if (!is_array($user)) {
            $user = $token->getUser();
        }

        if (!$user) {
            throw new AuthenticationException('User does not exist.');
        }

        $ssoUser = $this->userProvider->loadUser($user);

        return new PreAuthenticatedToken(
                $ssoUser, $user, $providerKey, $ssoUser->getRoles()
        );
    }

    public function supportsToken(TokenInterface $token, $providerKey)
    {
        return $token instanceof PreAuthenticatedToken && $token->getProviderKey() === $providerKey;
    }

}

1 个答案:

答案 0 :(得分:2)

我将登录路径设置为注销路径,如下所示:

secured_area:           
    form_login: 
        login_path : main_user_logout

然后我写了自定义注销处理程序:

/**
 * @Service("sso_authentication_handler")
 */
class SsoAuthenticationHandler implements LogoutSuccessHandlerInterface
{
    /**
     * @var Router
     */
    private $router;

    /**
     * @var array
     */
    protected $ssoUrls;

    /**
     * @InjectParams({
     *      "ssoUrls" = @Inject("%wordpress_sso%"),
     *      "router" = @Inject("router")
     * })
     */
    public function __construct(array $ssoUrls, Router $router)
    {
        $this->ssoUrls = $ssoUrls;
        $this->router = $router;
    }

    public function onLogoutSuccess(Request $request)
    {
        $locale = $request->getLocale();
        if ($locale === 'pl') {
            $url = $this->ssoUrls[$locale];
        } else {
            $url = $this->ssoUrls['en'];
        }

        $url .= '?returnUrl=' . $this->router->generate('main');

        return new RedirectResponse($url);
    }

}

所以使用这种组合我会产生一些行为,例如当你没有通过身份验证或者当他退出时,我会将他重定向到其他网站进行登录,在我的例子中是wordpress。

相关问题