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.
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. –
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
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'? –