2011-10-06 58 views
105

Tôi đang sử dụng thiết lập bảo mật Symfony. Tất cả mọi thứ hoạt động tốt, nhưng tôi không biết làm thế nào để làm một điều quan trọng:Làm cách nào để nhận thực thể đại diện cho người dùng hiện tại trong Symfony2?

Trong cành lá, tôi có thể đạt được thông tin của người dùng hiện tại bằng cách thực hiện:

Welcome, {{ app.user.username }} 

hoặc tương tự

Làm thế nào để truy cập thông tin tương tự trong Controller? Cụ thể, tôi muốn có được thực thể người dùng hiện tại để tôi có thể lưu trữ nó một cách có liên quan trong một thực thể khác (ánh xạ một-một).

Tôi đã thực sự hy vọng rằng nó muốn được

$this->get('security.context')->getToken()->getUser() 

nhưng điều đó không làm việc. Nó mang lại cho tôi một lớp các loại

Symfony\Component\Security\Core\User\User 

và tôi muốn một trong những loại

Acme\AuctionBundle\Entity\User 

đó là thực thể của tôi ....

+13

[Các Symfony Sách: Lấy đối tượng người dùng] (http://symfony.com/doc/master/book/security.html#retrieving-the-user-object) – Hubro

Trả lời

167

Như ktolis nói, trước tiên bạn phải định cấu hình /app/config/security.yml.

Sau đó, với

$usr= $this->get('security.context')->getToken()->getUser(); 
$usr->getUsername(); 

nên enougth!

$ usr là đối tượng người dùng của bạn! Bạn không cần truy vấn lại lần nữa.

Tìm hiểu cách thiết lập nhà cung cấp của bạn trong security.yml từ Sf2 Documentation và thử lại.

Chúc bạn may mắn!


EDIT: từ symfony 2.6, security.context dịch vụ được chấp nhận, sử dụng security.token_storage dịch vụ như:

$this->get('security.token_storage')->getToken()->getUser() 
+45

Với tôi, $ this-> getUser() cũng hoạt động để lấy đối tượng người dùng. – madc

+0

@madc Tìm kiếm tốt đẹp – ChocoDeveloper

+0

Nếu tôi cần thực thể người dùng trên mẫu PHP thì sao? – DomingoSL

-34

Vâng, trước tiên bạn cần phải yêu cầu tên người dùng của người dùng từ phiên trong hành động điều khiển của bạn như sau:

$username=$this->get('security.context')->getToken()->getUser()->getUserName(); 

sau đó thực hiện truy vấn đến db và nhận đối tượng của bạn DQL thường xuyên h như

$em = $this->get('doctrine.orm.entity_manager');  
"SELECT u FROM Acme\AuctionBundle\Entity\User u where u.username=".$username; 
$q=$em->createQuery($query); 
$user=$q->getResult(); 

các $ dùng bây giờ nên giữ cho người dùng tên người dùng này (bạn cũng có thể sử dụng các lĩnh vực khác tất nhiên)

... nhưng bạn sẽ phải đầu tiên cấu hình của bạn/app/cấu hình config/security.yml để sử dụng trường thích hợp cho nhà cung cấp bảo mật của bạn như vậy:

security: 
provider: 
    example: 
    entity: {class Acme\AuctionBundle\Entity\User, property: username} 

hy vọng điều này sẽ hữu ích!

+0

Vâng Martin bạn có muốn người dùng HOẶC tên người dùng. Sự lựa chọn là của bạn. Đó là trách nhiệm của bạn để có được đối tượng bạn cần. Và như bạn nói bạn không muốn người dùng thông thường nhưng người dùng không gian tên Acme. – ktolis

+5

"CHỌN u TỪ Acme \ AuctionBundle \ Entity \ User u trong đó u.username =". $ Username; = BẠN NÊN SỬ DỤNG CÁC CÂU HỎI THƯỜNG GẶP! – CappY

+0

'$ this-> get ('security.context') -> getToken() -> getUser()' chính nó sẽ cho bạn đối tượng người dùng đã đăng nhập. Bạn không phải truy vấn lại nó. Trong thực tế, bạn đang sử dụng phiên bản nào? – Jeet

6

Sợi chỉ là một chút cũ nhưng tôi nghĩ rằng điều này có lẽ có thể tiết kiệm thời gian của một ai đó ...

Tôi chạy vào cùng một vấn đề như bản gốc câu hỏi, mà loại được thể hiện như Symfony \ Component \ Security \ lõi \ User \ User

Nó cuối cùng hóa ra rằng tôi đã được đăng nhập bằng một trong sử dụng bộ nhớ

security.yml tôi trông s omething như thế này

security: 
    providers: 
     chain_provider: 
      chain: 
       providers: [in_memory, fos_userbundle] 
     fos_userbundle: 
      id: fos_user.user_manager 
     in_memory: 
      memory: 
       users: 
        user: { password: userpass, roles: [ 'ROLE_USER' ] } 
        admin: { password: adminpass, roles: [ 'ROLE_ADMIN', 'ROLE_SONATA_ADMIN' ] } 

các loại người dùng in_memory luôn là Symfony \ Component \ Security \ Lõi \ User \ User nếu bạn muốn sử dụng thực thể riêng của bạn, đăng nhập bằng sử dụng của nhà cung cấp đó.

Cảm ơn, hj

49

Thực hành tốt nhất

Theo the documentation từ Symfony 2.1 chỉ cần sử dụng phím tắt này:

$user = $this->getUser(); 

Ở trên là vẫn làm việc trên Symfony 3.2 và là một phím tắt cho điều này:

$user = $this->get('security.token_storage')->getToken()->getUser(); 

Dịch vụ security.token_storage được giới thiệu trong Symfony 2.6. Trước Symfony 2.6, bạn phải sử dụng phương thức getToken() của dịch vụ security.context.

Ví dụ: Và nếu bạn muốn trực tiếp tên người dùng:

$username = $this->getUser()->getUsername(); 

Nếu loại sai lớp người sử dụng

Người dùng sẽ là một đối tượng và lớp của đối tượng đó sẽ phụ thuộc vào bạn user provider.

2
$this->container->get('security.token_storage')->getToken()->getUser(); 
+0

Chào mừng bạn đến với stackoverflow. Xin giải thích về câu trả lời. stackoverflow.com/help/how-to-answer –

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