2014-01-10 30 views
0

如何管理Full authentication is required to access this resource.? 我想在用戶未通過身份驗證時重定向用戶。 我有自定義的uthenticater,根據會話數據對用戶進行身份驗證,並且我想在用戶未驗證身份時重定向用戶。Symfony2自定義身份驗證器在未經過身份驗證時會執行某些操作

我的鑑定者類:

/** 
* @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; 
    } 

} 

回答

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。

相關問題