Symfony 2: Làm cách nào để kiểm tra xem người dùng chưa đăng nhập bên trong mẫu?


101

Trong các mẫu Symfony 2 (sử dụng Twig), làm cách nào để kiểm tra hiệu quả xem người dùng chưa đăng nhập?

Tôi không muốn sử dụng ROLEséc. Tôi muốn có một cách đơn giản để kiểm tra xem người dùng chưa đăng nhập.

Tôi biết rằng so sánh app.user.usernamevới anoncác tác phẩm, nhưng điều đó không phù hợp với tôi.

Câu trả lời:


190

Bạn có thể kiểm tra xem app.user đã được đặt chưa.

 {% if app.user %}
    # user is logged in
 {% else %}
    # user is not logged in
 {% endif %}

17
Lưu ý rằng nếu bạn muốn kiểm tra xem người dùng KHÔNG đăng nhập, bạn có thể sử dụng:{% if not app.user %}
Mac_Cain13

44
Sử dụng {% if is_granted('IS_AUTHENTICATED_FULLY') %}thay thế. Xem Symfony2 doc: symfony.com/doc/current/book/… . Cũng có sẵn cho Silex: silex.sensiolabs.org/doc/providers/…
Ronan

16
@Ronan {% if is_granted('IS_AUTHENTICATED_FULLY') %}sẽ chỉ trả về true nếu người dùng đã xác thực trong phiên hiện tại. Nó sẽ trả về false nếu người dùng xác thực thông qua cookie nhớ tôi. Sử dụng {% if app.user %}là đúng, nếu người ta muốn trả về true bất kể khi nào người dùng xác thực.
RayOnAir

@Ronan, điều đó không hoạt động vì nó dẫn đến lỗi sau: Không tìm thấy nhà cung cấp xác thực cho mã thông báo của lớp "Symfony \ Component \ Security \ Core \ Authentication \ Token \ PreAuthenticatedToken".
Harold

{% if app.security.token is null or app.security.token.user == 'anon.' %}đó là cách tôi làm cho nó hoạt động với tôi
Sebastian G. Marinescu

98

Mặc dù câu trả lời hiện tại trả lời câu hỏi của OP, tôi muốn bổ sung thêm chi tiết.

Tôi hiểu OP không muốn kiểm tra các vai trò, nhưng tôi đưa chúng vào để những người dùng SO khác có thể sao chép và dán từ vai trò này trong tương lai. - mọi khi tôi google cái này, tôi kết thúc ở đây!

Nguồn Symfony Doc:


Kiểm tra xem có người dùng nào đã đăng nhập hay không (bất kể vai trò)

Như đã trả lời, bạn có thể sử dụng app.userđể kiểm tra xem người dùng nào đã đăng nhập hay không.

{% if app.user %}
    # user is logged in (any and all users, regardless of ROLE_*)
{% elseif not app.user %}
    # user is not logged in (note the `not` in the `elseif` statement)
{% endif %}

Kiểm tra trạng thái xác thực

Bạn có thể sử dụng is_granted()phương thức để kiểm tra ROLES, (Dưới đây là tất cả các vai trò do symfony chỉ định, Bạn cũng có thể có các vai trò của riêng mình (xem thêm bên dưới) )

{% if is_granted('IS_AUTHENTICATED_FULLY') %}
    # This user entered their credentials THIS session
{% elseif is_granted('IS_AUTHENTICATED_REMEMBERED') %}
    # User logged in via a cookie (ie: Auth again before doing sensitive things)
{% elseif is_granted('IS_AUTHENTICATED_ANONYMOUSLY') %}
    # This is a `guest` or anonymous user
{% endif %}

từ các tài liệu:

IS_AUTHENTICATED_ANONYMOUSLY - tự động được gán cho người dùng nằm trong phần được bảo vệ bằng tường lửa của trang web nhưng chưa thực sự đăng nhập. Điều này chỉ có thể thực hiện được nếu quyền truy cập ẩn danh đã được cho phép.

IS_AUTHENTICATED_REMEMBERED - tự động được gán cho người dùng đã được xác thực qua cookie nhớ tôi.

IS_AUTHENTICATED_FULLY - tự động được gán cho người dùng đã cung cấp chi tiết đăng nhập của họ trong phiên hiện tại.


Kiểm tra vai trò

Bạn cũng có thể sử dụng is_granted()để kiểm tra các vai trò.
Giả sử chúng ta có 3 vai trò ( ROLE_SUPER_ADMIN, ROLE_ADMIN, & ROLE_USER)

{% if is_granted('ROLE_SUPER_ADMIN') -%}
    # You're `ROLE_SUPER_ADMIN`
{% elseif is_granted('ROLE_ADMIN') -%}
    # You're `ROLE_ADMIN`
{% elseif is_granted('ROLE_USER') -%}
    # You're `ROLE_USER`
{% else %}
    # You're a `nobody` ;P
{%- endif %}

Làm như trên bên trong bộ điều khiển

Xem câu trả lời sau: Làm cách nào để kiểm tra xem người dùng đã đăng nhập Symfony2 bên trong bộ điều khiển hay chưa?


2
Tôi chỉ tò mò ... cái gì -%}{%-viết tắt của cái gì? tại sao không %}{%?
V-Light

11
Loại -bỏ tất cả các khoảng trắng ở cuối để dễ đọc hơn trong nguồn trình duyệt. Thông tin thêm tại đây: twig.sensiolabs.org/doc/templates.html#whitespace-control
Anil

Thứ lỗi cho tôi vì đã làm cho câu hỏi cũ này sống lại, nhưng tôi nghĩ rằng tôi đã đọc ở đâu đó rằng app.user sẽ không có giá trị đối với người dùng ẩn danh, điều đó có chính xác không? Điều đó có nghĩa là kiểm tra app.user là không đủ?
pzaj

@Anil symfony.com/doc/2.8/templating/app_variable.html tham số thứ hai được mô tả là app.user, sẽ như vậy The value stored in this variable can be a UserInterface object, any other object which implements a __toString() method or even a regular string.. Tôi không nhớ mình đã đọc ở đâu mà app.user trả về "anon". chuỗi không may và trong những trường hợp nào.
pzaj

1
@ user1970395 Dòng đầu tiên trong tài liệu được đọc The representation of the current user or null if there is none., vì vậy nó sẽ không có giá trị. Gói của bên thứ ba có thể trả về một chuỗi nếu UserInterfacetriển khai tùy chỉnh của nó có một __toString()phương thức được gọi khi ẩn danh.
Anil
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.