2012-01-31 24 views
15

Tôi muốn biết làm cách nào để biết liệu người dùng có được cấp khi người dùng đó không phải là người dùng hiện tại không.Nhận ROLE của một người dùng không đăng nhập TWIG Symfony2

tôi sử dụng mã này cho người dùng hiện:

{% if is_granted('ROLE_USER') %} 
    <a href="...">Delete</a> 
{% endif %} 

Nhưng tôi muốn để có thể làm điều tương tự với người dùng ohter rằng chưa đăng nhập vào lúc này. Cảm ơn bạn.

Chỉnh sửa: Thực tế tôi nghĩ rằng không có cách trực tiếp nào để kiểm tra vai trò của người dùng không được xác thực. Vì vậy, tôi đã làm nó trực tiếp trong mẫu cành, kiểm tra nếu một người dùng là admin hay không, sau đó thiết lập var. (trong câu hỏi của tôi, tôi đã tìm cách thực hiện trong một danh sách người dùng.)

{% set from_user_is_admin = false %} 
{% for role in from_user.getRoles() %} 
    {% if role == 'ROLE_ADMIN' %}{% set from_user_admin = true %}{% endif %} 
    {% if role == 'ROLE_SUPER_ADMIN' %}{% set from_user_admin = true %}{% endif %} 
{% endfor %} 
{% if from_user_admin == false %}THIS USER IS NOT ADMIN{% endif %} 

Trả lời

15

Tôi nghĩ rằng nó sẽ được dễ dàng hơn nhiều nếu bạn thực hiện một chức năng isGranted trong thực thể tài:

Class User implements UserInterface { 
    ... 
    public function isGranted($role) 
    { 
     return in_array($role, $this->getRoles()); 
    } 
} 

Bạn có thể dễ dàng kiểm tra xem có vai trò cấp trong mỗi lớp ứng dụng của bạn. Trong PHP:

$user->isGranted("USER_ADMIN") 

Hoặc trong Twig:

user.granted("USER_ADMIN") 

Nếu bạn cần phải kiểm tra một vai trò cho người sử dụng hiện tại, bạn có thể làm điều này trong Twig:

app.user.granted("USER_ADMIN") 

Lưu ý: biến "ứng dụng" được xác định toàn cầu.

Lưu ý 2: mã này có thể ném ngoại lệ nếu bạn sử dụng nó bên ngoài vùng được bảo mật của ứng dụng, vì app.user sẽ là NULL.

+0

Có! Đây chính xác là những gì tôi đã làm sau vài tháng học tập symfony2. – Rmannn

+12

Điều này có thể không hoạt động, vì có vai trò thừa kế – nick4fake

+2

Xem http://stackoverflow.com/a/24323223/877323 nếu bạn muốn xử lý vai trò thừa kế và không chỉ 'chặt chẽ' vai trò –

9

Bạn có thể sử dụng tuyên bố tương tự như trên với "không":

{% if not is_granted('ROLE_USER') %} 
    <a href="...">Delete</a> 
{% endif %} 

hoặc sử dụng báo cáo khác:

{% if is_granted('ROLE_USER') %} 
    <a href="...">Delete</a> 
{% else %} 
    {# something else for guest user, not logged in #} 
{% endif %} 
+3

Có tôi biết rằng funtion , nhưng is_granted đang thử nghiệm người dùng hiện tại. Điều tôi muốn biết là làm điều tương tự tạo thành một đối tượng người dùng không phải là người dùng hiện tại. Tôi chỉnh sửa câu hỏi của tôi để đặt theo cách tôi đã làm nó. Dù sao cũng cảm ơn bạn. – Rmannn

+3

@Lenda Bạn không đọc câu hỏi – Nanocom

+0

+1 * Tuyệt vời * triển khai! – mate64

4

Bạn nên tạo cành cây là macro hoặc chức năng cành.

Tạo một macro là rất đơn giản, sử dụng mã của bạn:

{% macro admin_status(from_user) %} 
    {% set from_user_is_admin = false %} 
    {% for role in from_user.getRoles() %} 
     {% if role == 'ROLE_ADMIN' %}{% set from_user_admin = true %}{% endif %} 
     {% if role == 'ROLE_SUPER_ADMIN' %}{% set from_user_admin = true %}{% endif %} 
    {% endfor %} 
    {% if from_user_admin == false %}THIS USER IS NOT ADMIN{% endif %} 
{% endmacro %} 

Sau đó, bạn có thể sử dụng nó trong cùng một tập tin như {% _self.admin_status(user) %}. Bạn cũng có thể di chuyển nó vào một tệp riêng biệt và sử dụng thẻ import của twig để có quyền truy cập vào tệp đó.

Tạo chức năng xoay là một lựa chọn tốt hơn, để biết chi tiết, xem extending twig. Nó tóm tắt để tạo ra một chức năng thông thường, có thể được gọi từ cành, vì vậy mã như thế này trở thành có thể:

{% if user_is_admin(user) %} 

Bạn cũng cần phải đọc enabling custom twig extensions.

+0

WOw, Cảm ơn bạn rất nhiều, tôi có thể đặt mã đó trong một mẫu văn bản, bao gồm nó, sau đó sử dụng lại mã! – Rmannn

0

tôi đã làm nó theo cách này, có đoạn này trong file cành lá toàn cầu, trong trường hợp của tôi layout.html.twig

{% set is_admin = false %} 
{% if app.security.token.user.roles is iterable %} 
    {% for role in app.security.token.user.roles %} 
     {% if role == 'ROLE_ADMIN' or role == 'ROLE_SUPER_ADMIN' %} 
      {% set is_admin = true %} 
     {% endif %} 
    {% endfor %} 
{% endif %} 

sau đó tôi có thể sử dụng bất cứ nơi nào

{% if is_admin %}....{% endif %} 
Các vấn đề liên quan