2013-06-12 30 views
6

Tôi muốn biết liệu người dùng có vai trò 'VIEW_GEOLOC_DATA' hay không, nhưng tôi gặp sự cố khi sử dụng chức năng twig is_granted().Twig/Symfony2: vai trò bội số với is_granted

Nếu tôi sử dụng trong một khuôn mẫu:

Roles : {{ dump(app.user.getRoles()) }} 
is_granted('ROLE_SUPER_ADMIN') : {{ dump(is_granted('ROLE_SUPER_ADMIN')) }} 
is_granted('VIEW_GEOLOC_DATA') : {{ dump(is_granted('VIEW_GEOLOC_DATA')) }} 

Đây là những gì tôi nhận được khi vẽ:

array(2) { 
    [0]=> 
    string(16) "ROLE_SUPER_ADMIN" 
    [1]=> 
    string(16) "VIEW_GEOLOC_DATA" 
} 
is_granted('ROLE_SUPER_ADMIN') : bool(true) 
is_granted('VIEW_GEOLOC_DATA') : bool(false) 

Tôi đã cố gắng để đăng nhập vào và ra, đổ bộ nhớ cache của symfony.
Tôi cũng đã cố gắng chuyển thứ tự của vai trò trong mảng được trả về bởi phương thức getRoles() của Người dùng của tôi: hàm is_granted sẽ chỉ tính đến vai trò đầu tiên của mảng

Trả lời

8

tôi đã kết thúc việc tạo ra một phương pháp mới hasRole trong User Lớp tôi:

public function hasRole($role) 
{ 
    return in_array($role, $this->getRoles()); 
} 

Sau đó, trong một khuôn mẫu, tôi sử dụng:

{% if app.user.hasRole('ROLE_VIEW_GEOLOC_DATA') %} 
    {# do something #} 
{% endif %} 

EDIT: Như @ JonnyS cho biết, có thể các vai trò phải bắt đầu bằng ROLE_ để hoạt động vớiChức năng của Symfony 210. Đã không được thử nghiệm.

+6

như là một vấn đề rõ ràng có thể trực tiếp trả về kết quả của in_array, thay vì thêm một if/else: 'return in_array ($ role, $ this-> getRoles());' –

+1

Nó không phải là cùng một tài khoản is_granted cho kế thừa ROLE , trong khi chỉ kiểm tra xem người dùng có vai trò được chỉ định không – Gamesh

8

Nếu bạn đang mong đợi Symfony2 xử lý vai trò của bạn, sau đó vai trò của bạn cần phải bắt đầu bằng "ROLE_".

Thay đổi

'VIEW_GEOLOC_DATA' 

để

'ROLE_VIEW_GEOLOC_DATA' 

Tất nhiên, bạn sẽ cần phải thay đổi điều này trong cấu hình của bạn và thêm vai trò mới.

Câu trả lời này không áp dụng, nếu bạn đang sử dụng lớp Vai trò chuyên dụng.

+0

tôi không sử dụng một lớp Vai trò, đây là định nghĩa của tôi về getRoles(): getRoles 'public function() { if ($ this-> vai trò == 100) mảng trở lại ('ROLE_SUPER_ADMIN', 'VIEW_GEOLOC_DATA'); } ' Nhưng hành vi cũng giống như [Quản lý vai trò trong cơ sở dữ liệu] (http://symfony.com/doc/2.1/cookbook/security/entity_provider.html#managing-roles-in-the-database) –

+2

Thử thay đổi nó để sử dụng tiền tố 'ROLE_'. Symfony 2 không thích các vai trò không có tiền tố. Từ các tài liệu, "Tất cả các vai trò phải bắt đầu bằng tiền tố ROLE_ được quản lý bởi Symfony2." http://symfony.com/doc/2.1/book/security.html Chúc may mắn và cho tôi biết nếu nó hoạt động. – JonnyS

+0

Nó thay đổi không có gì –

Các vấn đề liên quan