2017-04-09 48 views
0

我正在開發一個symfony項目,我在用戶身份驗證中遇到了一個問題,我希望您解決這個問題,因爲我是新手。Symfony2如何驗證具有兩個不同用戶名的用戶以訪問不同的URL

我的項目是關於一所學校,教師類型的用戶在數據庫中有usernamepassword屬性。用戶名由t後跟個人識別號碼組成,例如t48945110。另外,教師有一個布爾屬性來表明他們哪一個是校長(只有一個)。

是我的項目中的安全設置如下:

Secutiry.yml

security: 

    firewalls: 

    intranet: 
     pattern: ^/ 
     anonymous: ~ 
     provider: teachers 
     form_login: 
      login_path: /login 
      check_path: /login_check 
      # use_referer: true 
      default_target_path: /teacher 
     logout: ~ 

    access_control: 
    - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: admin/, roles: ROLE_ADMIN } 
    - { path: /teacher, roles: ROLE_TEACHER } 

    providers: 
     teachers: 
     entity: { class: School\BackendBundle\Entity\Teacher, property: username} 

    encoders: 
     School\BackendBundle\Entity\Teacher: { algorithm: sha512 } 

上述內容,老師可以accerder通過登錄表單他的私處,但問題當我想要與導演(在數據庫中具有屬性(director=1)的教師)訪問時,我有。我希望這位老師能夠訪問另一個用戶名,但不能將其保存在數據庫中,只需更改主要字母,然後在認證中查找老師的普通用戶名,並檢查導演是否將其重定向到/ admin而不是/teacher。例如,學校的負責人可以通過用戶名t48945110訪問他的個人區域作爲教師,也可以用用戶名d48945110訪問學校的管理區域。

這個想法並不是創建兩個不同的登錄表單,而是訪問應用程序的所有用戶(學生,教師,導演......)。

我不知道它是否可以通過事件偵聽器或其他方式完成。感謝您的幫助。

+0

這似乎對我來說過於複雜。用戶名不應該對特定用戶具有的角色有任何指示。爲什麼沒有一個位於admin /的管理界面,並且只需通過ACL爲老師限制訪問權限? – Atan

+0

你好@Atan,謝謝你的回覆。在這種情況下,要訪問管理員/教師必須先訪問私人區域,然後添加一個選項以打開管理部分,對嗎?這是我的主要想法,但我不確定是否有任何方法讓教師獨立訪問每個部分,而不使用兩種不同的形式,以便他可以這樣做。 – Joseph

+0

不,我的意思是使用單一登錄表單,並將每個用戶(學生,老師,導演)重定向到admin /。然後使用ACL規則根據角色限制用戶在管理面板中的訪問權限。例如,導演有兩個角色:ROLE_TEACHER和ROLE_ADMIN。教師只有ROLE_TEACHER。 – Atan

回答

1

我認爲你可能會過於複雜的事情。我很確定你的導演不想用不同的用戶名登錄進入單獨的部分。不知道更多的細節,我建議是改變你的School\BackendBundle\Entity\TeachergetRoles()到這樣的事情:

public function getRoles() 
{ 
    $roles = array('ROLE_TEACHER'); 
    if ($this->director == 1) { 
     $roles[] = 'ROLE_DIRECTOR'; 
     $roles[] = 'ROLE_ADMIN'; 
    } 

    return $roles; 
} 

這可能是讓用戶既具有教師訪問他們的安全區域,以及最簡單的方法作爲導演可以訪問管理區域而無需切換帳戶。

如果由於某種原因,這不起作用,你可以看看Security Voters。這可能是這個樣子:

class TeacherIsDirectorVoter extends Voter 
{ 

    protected function supports($attribute, $subject) 
    { 
     // This voter will always be used 
     return true; 
    } 

    protected function voteOnAttribute($attribute, $subject, TokenInterface $token) 
    { 
     $user = $token->getUser(); 
     // This voter will allow access if the currently logged in user is teacher and is a director 

     return ($user instanceof Teacher && $user->isDirector()); 
    } 
} 

再次,這將給予一個老師誰是沒有要求他們登錄爲不同的用戶董事訪問。請謹慎選擇這位選民,因爲它將始終授予對您的網站所有部分使用默認投票策略的director=1的訪問權限。有多種方法可以改變這種情況,或者您可以根據提供的屬性和被投票的主題添加支票。

我認爲您的用例第一個選項(更新角色)可能是最簡單的,並且適合您。

如果你想讓學生,老師和導演在登錄後重定向到不同的頁面,你可以做一個小動作。在你的SecurityController(或者你有loginAction的地方)中,創建一個新的targetAction(),成功登錄後用作目標。在你的security.yml中,將form_login的default_target_path分配給該路由,而不是/ teacher。這一行動應該可以被所有3個用戶組訪問。現在只需重定向,基於您的用戶擁有的任何角色:

public function targetAAction() 
{ 
    $user = $this->getUser(); 
    if (in_array('ROLE_ADMIN', $user->getRoles())) { 
     return $this->redirectToRoute('intranet_admin_page'); 
    } 
    if (in_array('ROLE_TEACHER', $user->getRoles())) { 
     return $this->redirectToRoute('intranet_teacher_page'); 
    } 

    return $this->redirectToRoute('generic_page_for_users'); 
} 
相關問題