Symfony 2: Bagaimana cara memeriksa apakah pengguna tidak login di dalam template?

102

Di template Symfony 2 (menggunakan Twig), bagaimana saya bisa secara efektif memeriksa apakah pengguna tidak login?

Saya tidak ingin menggunakan ROLEcek. Saya ingin cara langsung untuk memeriksa apakah pengguna belum masuk.

Saya sadar bahwa membandingkan app.user.usernamedengan anonkarya, tetapi itu terasa tidak tepat bagi saya.

Alat
sumber

Jawaban:

191

Anda dapat memeriksa apakah app.user sudah diatur.

 {% if app.user %}
    # user is logged in
 {% else %}
    # user is not logged in
 {% endif %}
Checksum
sumber
17
Perhatikan bahwa jika Anda ingin memeriksa apakah pengguna TIDAK masuk, Anda dapat menggunakan:{% if not app.user %}
Mac_Cain13
44
Gunakan {% if is_granted('IS_AUTHENTICATED_FULLY') %}sebagai gantinya. Lihat dokumen Symfony2 : symfony.com/doc/current/book/… . Juga tersedia untuk Silex: silex.sensiolabs.org/doc/providers/…
Ronan
16
@Ronan {% if is_granted('IS_AUTHENTICATED_FULLY') %}hanya akan mengembalikan nilai true jika pengguna telah mengautentikasi dalam sesi saat ini. Ini akan mengembalikan false jika pengguna mengautentikasi melalui cookie ingat saya. Penggunaannya {% if app.user %}benar, jika seseorang ingin mengembalikan nilai true terlepas dari kapan pengguna mengautentikasi.
RayOnAir
@Ronan, itu tidak berfungsi karena menghasilkan kesalahan berikut: Tidak ada Penyedia Otentikasi yang ditemukan untuk token kelas "Symfony \ Component \ Security \ Core \ Authentication \ Token \ PreAuthenticatedToken".
Harold
{% if app.security.token is null or app.security.token.user == 'anon.' %}begitulah cara saya membuatnya bekerja untuk saya
Sebastian G. Marinescu
98

Meskipun jawaban saat ini menjawab pertanyaan OP, saya ingin menambahkan lebih detail.

Saya memahami OP tidak ingin memeriksa peran, tetapi saya memasukkannya sehingga pengguna SO lain dapat menyalin dan menempelkannya di masa mendatang. - setiap kali saya google ini, saya berakhir di sini!

Sumber Doc Symfony:


Periksa apakah ada pengguna yang masuk (terlepas dari perannya)

Seperti yang dijawab, Anda dapat menggunakan app.useruntuk memeriksa apakah ada pengguna yang masuk.

{% 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 %}

Memeriksa status otentikasi

Anda dapat menggunakan is_granted()metode ini untuk memeriksa ROLES, (Di bawah ini adalah semua peran yang diberikan oleh symfony, Anda juga dapat memiliki peran Anda sendiri (selengkapnya di bawah) )

{% 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 %}

dari dokumen:

IS_AUTHENTICATED_ANONYMOUSLY - secara otomatis diberikan kepada pengguna yang berada di bagian situs yang dilindungi firewall tetapi belum benar-benar masuk. Ini hanya mungkin jika akses anonim telah diizinkan.

IS_AUTHENTICATED_REMEMBERED - secara otomatis ditetapkan ke pengguna yang diautentikasi melalui cookie ingat saya.

IS_AUTHENTICATED_FULLY - secara otomatis ditetapkan ke pengguna yang telah memberikan detail login mereka selama sesi saat ini.


Memeriksa Peran

Anda juga dapat menggunakan is_granted()untuk memeriksa peran.
Dengan asumsi kita memiliki 3 peran ( 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 %}

Melakukan hal di atas di dalam pengontrol

Lihat jawaban berikut: Bagaimana cara memeriksa apakah pengguna login di Symfony2 di dalam pengontrol?

Anil
sumber
2
Saya hanya penasaran ... apa -%}dan {%-kepanjangannya? kenapa tidak %}dan {%?
V-Light
11
The -menghapus semua Trailing spasi sehingga lebih mudah dibaca dalam source browser. Info lebih lanjut di sini: twig.sensiolabs.org/doc/templates.html#whitespace-control
Anil
Maafkan saya karena membawa pertanyaan lama ini untuk hidup lagi, tapi saya rasa saya membaca di suatu tempat bahwa app.user tidak akan null untuk pengguna anonim, bukankah itu benar? Bukankah itu berarti bahwa pemeriksaan app.user tidak cukup?
pzaj
@Anil symfony.com/doc/2.8/templating/app_variable.html Parameter kedua yang dijelaskan adalah app.user, berjalan seperti itu The value stored in this variable can be a UserInterface object, any other object which implements a __toString() method or even a regular string.. Saya tidak ingat di mana saya membaca bahwa app.user mengembalikan "segera." string sayangnya dan dalam keadaan apa.
pzaj
1
@ user1970395 Baris pertama dalam dokumen dibaca The representation of the current user or null if there is none., jadi ini akan menjadi null. Paket pihak ketiga dapat mengembalikan string jika UserInterfacepenerapan khususnya memiliki __toString()metode yang dipanggil saat anonim.
Anil