2011-12-10 30 views
10

Tôi đang phát triển một phần của một ứng dụng web được xây dựng trên Symfony 2. Giống như trong nhiều ứng dụng, cần phải ủy quyền xác thực &. Làm cách nào tôi có thể tiếp tục phát triển, cân nhắc việc ACL bằng cách chuyển hoặc giả mạo thông tin đăng nhập?Làm thế nào để phát triển bằng cách giả mạo đăng nhập để kiểm tra ACL trong Symfony 2

Trong tài liệu, login_check có phần xác thực và phiên minh bạch. Tôi nghĩ rằng tôi hoặc là có thể cần phải thực hiện một phiên bản của đó hoặc bằng cách nào đó gọi nó để đăng nhập người dùng như khác nhau/vai trò

Trả lời

29

Tôi không hoàn toàn chắc là tôi hiểu câu hỏi của bạn nhưng bạn chỉ hỏi cách bạn đăng nhập theo chương trình?

Trong các thử nghiệm của tôi, tôi chỉ đơn giản là làm một cuộc gọi như:

$this->container->get('security.context')->setToken(
    new UsernamePasswordToken(
     'maintenance', null, 'main', array('ROLE_FIXTURE_LOADER') 
    ) 
); 

Trong trường hợp 'bảo trì' đây không phải là ngay cả một đơn vị tài sản, nó chỉ là một tên người dùng mà tôi đã bù đắp lại đồ đạc của tôi để họ có thể truy cập vào một dịch vụ bằng cách ROLE_FIXTURE_LOADER nhưng nếu bạn đã muốn đăng nhập như một thực thể sử dụng đầy đủ (để họ có ID ACL đúng), bạn có thể nhận được một đối tượng $user từ cơ sở dữ liệu và gọi:

$this->container->get('security.context')->setToken(
    new UsernamePasswordToken(
     $user, null, 'main', $user->getRoles()) 
    ) 
); 

này doesn' t đăng nhập đầy đủ nhưng nó hoạt động với RBAC d Tôi không thấy lý do tại sao nó sẽ không làm việc với ACL nếu bạn vượt qua một đối tượng người dùng thực tế.

Đối với thử nghiệm chức năng của giao diện người dùng của tôi nếu tôi cần đăng nhập, tôi chỉ cần điều hướng đến trang đăng nhập và gửi biểu mẫu theo tài liệu kiểm tra. Đối với một trong những người làm việc, bạn cần truy cập vào vùng chứa để bạn cần mở rộng WebTestCase hoặc cuộn khả năng của riêng bạn để khởi động hạt nhân (xem here).

Tôi có cảm giác mình đã hiểu sai câu hỏi (ví dụ: bạn cần phải làm điều gì đó phức tạp hơn là chỉ đặt mã thông báo). Có lẽ bạn có thể thử để làm rõ hơn một chút những gì bạn có ý nghĩa bởi

đi hoặc giả mạo một tên đăng nhập

Một ví dụ cụ thể để trồng một mã thông báo an ninh trong một thử nghiệm:

chúng tôi đầu tiên tạo một lớp cơ sở cho các bài kiểm tra của chúng tôi để sử dụng có chứa phương thức tiện lợi đăng nhập. Điều này có thể được thực hiện bằng cách mở rộng WebTestCase và sử dụng phương pháp getContainer trên client HOẶC bạn có thể kéo WebTestCase ngoài việc cuộn lớp cơ sở của riêng bạn mà khởi động hạt nhân mà không cần ứng dụng khách và trả lại vùng chứa (xem số link của mình để có hai giải pháp) .

namespace Acme\SomeBundle\Tests; 

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; 
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken; 

abstract class AcmeTestCase extends WebTestCase { 

    protected function loginAs($client, $username) { 
     $container = $client->getContainer(); 
     $doctrine = $container->get('doctrine'); 

     $user = $this->loadUser($doctrine, $username); 

     // First Parameter is the actual user object. 
     // Change 'main' to whatever your firewall is called in security.yml 
     $container->get('security.context')->setToken(
      new UsernamePasswordToken(
       $user, null, 'main', $user->getRoles() 
      ) 
     ); 
    } 

    private function loadUser($doctrine, $username) { 
     // Don't have to use doctrine if you don't want to, you could use 
     // a service to load your user since you have access to the 
     // container. 

     // Assumes User entity implements UserInterface 
     return $doctrine 
       ->getRepository('AcmeUserBundle:User') 
       ->findOneByUsername($username); 
    } 

} 

Sau đó, bạn chỉ cần sử dụng lớp cơ sở của mình trong bất kỳ bài kiểm tra nào bạn muốn. Giống như vậy:

namespace Acme\SomeBundle\Tests\Entity; 

use Acme\SomeBundle\Tests\AcmeTestCase; 

class SomeEntityTest extends AcmeTestCase { 

    public function somethingTest() { 
     $this->loginAs(static::createClient(), 'SomeUsernameInDB'); 

     // Do the rest of your test here. 
    } 

} 

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

+0

Tôi nghĩ bạn đã làm đúng, tôi có thể thử lại sau. Tôi chỉ muốn giả mạo một đăng nhập để tôi có thể kiểm tra logic ACL của tôi. –

+0

Hy vọng nó sẽ giúp bạn sau đó :). Để kiểm tra ACL, sử dụng đoạn mã thứ hai của tôi. Chỉ cần nhận thực thể '$ user' của bạn từ' EntityManager' hoặc 'Repository' trước và chuyển nó vào token như' $ user'. – Kasheen

+0

Ok, chỉ cần thử nghiệm này thực tế ... Tôi nhận được 'Không có nhà cung cấp người dùng cho người dùng" Chai \ Bundle \ NotesBundle \ Entity \ User "' bây giờ. Tôi thực sự tạo ra một tùy chỉnh 'FakeUserToken' có lẽ tôi shld chỉ sử dụng UsernamePasswordToken? Tôi đã cố gắng gần nhất có thể với điều thực sự mà tôi có thể có được người dùng đã đăng nhập. Làm thế nào tôi có thể làm điều đó với 'UsernamePasswordToken'? –

1

Không chắc tôi hiểu câu hỏi của bạn rất tốt nhưng Nếu bạn chỉ muốn xem các ứng dụng với vai trò người dùng khác nhau mà bạn có thể sử dụng Vai trò Switcher Symfony tài liệu ở đây: http://symfony.com/doc/current/book/security.html#impersonating-a-user

Vì vậy, bạn chỉ cần đặt một tham số trong url của bạn để xem ứng dụng của bạn với tư cách người dùng được kết nối khác.

Hy vọng điều đó sẽ hữu ích!

+1

Tôi tin rằng tôi cần phải đăng nhập với tư cách quản trị viên trước –

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