2012-04-05 3 views
2

У меня есть User и Group Entity, которые содержат массив ролей.Где определить роли безопасности?

Теперь я хотел бы оставить опцию открытой, чтобы модифицировать роли, добавить их и так далее.

Должен ли я использовать константы в классах для этого или я должен связать отношение OneToOne с таблицей, которая сохраняет все роли?

С наилучшими пожеланиями, pus.dev

< Пользователь => Роль группы < => Роль

public function getRoles() 
{ 
    $roles = $this->roles; 

    foreach ($this->getGroups() as $group) { 
     $roles = array_merge($roles, $group->getRoles()); 
    } 

    // we need to make sure to have at least one role 
    $roles[] = static::ROLE_DEFAULT; 

    return array_unique($roles); 
} 
+0

Почему бы не использовать FOSUserBundle для этого? Он предоставляет все необходимое. – Flukey

+0

Привет, переключился с FOSUserBundle на собственный Bundle :) Как создать новые роли в Symfony? –

ответ

2

Как насчет создания таблицы ролей с ManyToOne отношению к каждому пользователю. Одна строка таблицы Roles будет содержать роль (строка или константа int) и пользователь.

В качестве альтернативы вы можете создать таблицу ролей и иметь отношение ManyToMany к таблице User. Используя это, вы можете динамически определять роли, поэтому вам не нужно жестко указывать возможные роли.

В OneToMany случае вы могли бы получить роли, написав такую ​​функцию:

/** @OneToMany(...) */ 
/** $roles contains strings */ 
protected $roles; 

public function getRoles() { 
    return $this->roles; 
} 

ИЛИ

/** @OneToMany(...) */ 
/** $roles contains integers */ 
protected $roles; 

public function getRoles() { 
    $rolesArr = array(1 => 'ROLE_ADMIN', 2 => 'ROLE_USER', 3 => 'ROLE_EDITOR'); // you should refactor $rolesArr 
    $retRoles = array(); 
    foreach($this->roles as $role) { 
     $retRoles[] = $rolesArr[$role]; 
    } 
    return $retRoles; 
} 

В случае ManyToMany вы могли бы получить роли, написав такую ​​функцию:

/** @ManyToMany(...) */ 
protected $roles; 
// ... 
public function getRoles() { 
    $retRoles = array(); 
    // symfony2 requires a string array 
    foreach($this->roles as $role) { 
     $retRoles[] = $role->getName(); // or $retRoles[] = 'ROLE_' . $role->getName(); 
    } 
    return $retRoles; 
} 

И не забывайте, что ваша модель пользователя должна реализовывать встроенный iSymfony n Пользовательский интерфейс.

Для групповых ролей, которые вы можете сделать это:

class Group 
{ 
    /** @ManyToMany(...) */ 
    protected $roles; 

    public function getRoles() { 
     return $this->roles; 
    } 
} 

class User 
{ 
    /** @ORM\Column(...) */ 
    protected $group; 

    /** @ManyToMany(...) */ 
    protected $roles; 
    // ... 

    public function getRoles() { 
     $retRoles = array(); 
     // symfony2 requires a string array 
     $roles = $this->roles->merge($this->group->getRoles()); 
     foreach($roles as $role) { 
      $retRoles[] = $role->getName(); // or $retRoles[] = 'ROLE_' . $role->getName(); 
     } 
     return $retRoles; 
    } 
} 
+0

Привет, благодарю вас за подробное описание. Я бы взял ManyToMany путь. Не могли бы вы рекомендовать мне, что вы будете использовать для свойств в объекте Role? Что необходимо для совместимости с ACL? Также как я могу гарантировать ManyToMany с пользователем и группой? –

+0

Группа содержит много пользователей, каждый пользователь имеет много ролей, каждая роль имеет много пользователей, группы imho не имеют ничего общего с ролями пользователей. –

+0

Но группа могла хранить специальные данные. Например, есть дополнительная Административная группа, и все члены имеют дополнительный ROLE_ADMIN. Не будет ли это хорошим примером, когда группы, занимающие роли, будут хороши? –

Смежные вопросы