2013-03-24 77 views
2

我試圖在Symfony2中實現非常基本的身份驗證。以下是代碼的主要部分我實在看不出有什麼問題登錄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,有創建身份驗證的用戶,保存令牌,比重定向到作爲認證用戶的安全區域。不幸的是,我的代碼以重定向循環結束,看起來像安全防火牆不接受用戶身份驗證。你有沒有看到任何問題?

+1

,能不能請你傾倒所有security.yml代碼和所有的控制器代碼。 – 2013-03-24 21:25:29

回答

0

那麼,你的控制器工作是渲染只是形式,而不是填充安全上下文。 Symfony2安全防火牆會自動爲你做到這一點。除非你想建立你自己的custom authentication,否則你不需要處理它。

換句話說,你的工作是顯示登錄表單,並可能已發生的任何登錄 誤差,但安全體系本身需要檢查提交的用戶名和密碼, 認證用戶的 照顧。

請看這document清晰的圖片。

如果你想在用戶登錄時做一些自定義的事情,在Symfony2中你必須添加一個事件監聽器,在用戶成功登錄後觸發事件。被觸發的事件是security.interactive_login並且爲你掛鉤必須在services.yml文件中指定這個你的包的文件Resources/config目錄:

+0

謝謝你的迴應。我需要沒有登錄表單的身份驗證。身份驗證將基於URL啓動獨立於symfony的第三方身份驗證。我需要的是有能力手動創建用戶。我正在閱讀自定義身份驗證,它看起來像這樣一個小任務真正的大解決方案。 – jros 2013-03-25 08:18:46

+0

啊好的。我接到你了。但是你正在驗證的測試用戶沒有在providers-> in_memory-> users列表中定義。所以,重定向是無限的。試試這個,$ token = new UsernamePasswordToken('user','userpass',$ providerKey,array('ROLE_USER')); – Venu 2013-03-25 08:24:39

+0

我改變了這一行,並以重定向循環結束。匿名用戶被重定向到登錄控制器,它在那裏創建用戶令牌,但是由於防火牆不認爲用戶被認證,下一次重定向失敗。它看起來像我的令牌沒有保存。我已經嘗試將它保存到會話中,像這樣$ this-> container-> get('request') - > getSession() - > set('_security_secured-area',serialize($ token)),但它不是更好 – jros 2013-03-25 08:59:02

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