2011-08-27 107 views
0

我在Symfony中構建了一個登錄系統。在每個安全的頁面上我需要驗證用戶名是否與密碼匹配。我寫了一個函數:isValidAuth()myUser.class.php。不過我需要寫在這些動作線的每一頁:Symfony自動運行函數

if(!isValidAuth()) 
{ 
    $this->forward('home', 'logout'); 
} 

,當你有一個固定的多個頁面和模塊這是相當不方便。有沒有什麼辦法可以像頁面is_secured那樣運行這些行?就像在頁面加載時訪問executeIndex()一樣?

+1

除了我回答。還有其他一些方法來實現這種「自動運行」功能。例如你可以用你的自定義構造函數來擴展sfAction,或者使用'preExecute()'和'postExecute()'函數在你每次調用模塊的動作時執行 – Flask

回答

0

最好的地方,這將是過濾鏈,我甚至建議擴展sfBasicSecurityFilter。爲了使您的擴展類,編輯應用程序/ MyApp的/配置/ filters.yml

rendering: ~ 
security: 
    class: myExtendedSecurityFilter 

# Generally, you will want to insert your own filters here 

cache:  ~ 
execution: ~ 

而是延伸sfBasicSecurityFilter的,你也可以創建一個擴展sfFilter一個新的類。瞭解更多關於過濾器的位置:

http://www.symfony-project.org/gentle-introduction/1_4/en/06-Inside-the-Controller-Layer#chapter_06_filters

1

Symfony中有一個內置功能來處理這個問題。 manaual適用於1.2版本,但它也適用於1.4版本:http://www.symfony-project.org/book/1_2/06-Inside-the-Controller-Layer

因爲在1.4的配置值已經更改爲真/假的,而不是開/關,你將不得不改變他們:http://www.symfony-project.org/reference/1_4/en/08-Security

應用/前端/模塊/ mymodule中/配置/ security.yml

all: 
    is_secure: true  # for all actions of a module 

foo: 
    is_secure: false  # action foo is public 
在應用

/前端/配置/ settings.yml中,你將不得不提供一個模塊和作用,這確實登錄等

all: 
    .actions: 
    login_module: default 
    login_action: login 

    secure_module: default 
    secure_action: secure 

最後但並非最不重要您需要在用戶身上設置認證標誌(通常在登錄後;)):

$this->getUser()->setAuthenticated(true); 

順便說一句。也許你應該安裝sfdoctrineguardplugin,它提供了用戶的處理,登錄等開箱即用;)