2014-09-17 13 views
5

Tôi đang làm việc để tạo nhà cung cấp xác thực cho Symfony 2 cho phép người dùng xác thực bằng giao thức đăng nhập một lần có tên là CAS.Symfony2: Cách nhận các giá trị cấu hình Trình lắng nghe xác thực vào một dịch vụ khác?

My Trình nghe xác thực kéo dài từ AbstractAuthenticationListener. Một trong các tham số cấu hình là check_path, là đường dẫn/tuyến đường kích hoạt trình lắng nghe xác thực để xác thực yêu cầu.

Tôi cần check_path khi tôi xây dựng các URL đến máy chủ CAS (vì vậy CAS máy chủ biết nơi để trả lại người sử dụng), đó là dễ dàng, vì tùy chỉnh của tôi Entry Point lớp được thông qua các mảng cấu hình khi nó được xây dựng trong an ninh của tôi Nhà máy.

Phần khó là tôi cũng cần check_path bên ngoài trình nghe, như trong khi xác thực trong lớp Nhà cung cấp xác thực của mình. Tôi cần nó vì khi máy chủ CAS gửi người dùng quay trở lại ứng dụng, nó sẽ chuyển một thông số "ticket" phải được xác thực. Để xác thực nó, tôi gửi một yêu cầu curl đến máy chủ CAS phải chứa vé cũng như check_path gốc đã được sử dụng. Khi viết bài này, tôi nhận ra rằng tôi có thể nhận URL hiện tại của yêu cầu trang khi tôi ở bên trong Nhà cung cấp xác thực (vì nó là check_path kích hoạt nó), nhưng điều đó có vẻ như vậy, và tôi muốn nhận giá trị cấu hình trực tiếp để xây dựng lại URL dịch vụ. Nó cũng không giúp tôi khi tôi muốn sử dụng check_path ở nơi khác, như khi xây dựng URL đăng xuất tới máy chủ CAS cũng yêu cầu check_path.

EDIT: Phương pháp createAuthProvider của AbstractFactory thông qua cả hai cấu hình và container, nhưng tôi không thể sửa đổi bất kỳ dịch vụ của tôi ở đây vì họ chưa một phần của container. Có lẽ nếu tôi có một cách để thêm một trình biên dịch vượt qua sau khi dịch vụ của tôi được nạp và bằng cách nào đó có quyền truy cập vào cấu hình người nghe?

Trả lời

0

Bạn có thể chuyển check_path làm thông số cho người nghe của mình không?

Nếu nó được định nghĩa trong cấu hình hoặc các thông số của bạn tập tin bạn có thể vượt qua nó để người nghe của bạn như thế này:

your_authentication_listener: 
    class: YourBundle\Listener\AuthenticationListener 
    arguments: ['%check_path%'] 
    tags: 
     ... 

(Nếu tôi hiểu bạn đúng.)

+0

'check_path' không phải là thông số bình thường nên không thể thực hiện việc này. Nó là một tùy chọn cấu hình cho người nghe xác thực (xem mã cho lớp 'AbstractAuthenticationListener'). – Brian

0

Bạn có thể làm %check_path% (hoặc một namespaced phiên bản của nó) một tham số 'bình thường': Bên trong của DependencyInjection, có (theo mặc định) hai lớp chịu trách nhiệm xác định và tải cấu hình của gói của bạn. Trong đó bạn cũng có thể tiêm cấu hình của bạn vào thùng chứa dịch vụ của bạn.

  • DependencyInjection\Configuration là nơi bạn xác định các cấu hình có sẵn trong gói của bạn, loại họ nên được, vv

  • DependencyInjection\YourBundleNameExtension là nơi bạn có thể tải cấu hình của bạn và cũng có thể thêm chúng vào container dịch vụ.

Nếu bạn đã không thực hiện bất cứ điều gì trong đó chưa, load() -method của mở rộng của bạn sẽ giống như thế này:

public function load(array $configs, ContainerBuilder $container) 
{ 
    $configuration = new Configuration(); 
    $config = $this->processConfiguration($configuration, $configs); 

    $loader = new Loader\YamlFileLoader(
     $container, 
     new FileLocator(__DIR__.'/../Resources/config') 
    ); 
    $loader->load('services.yml'); 
} 

$config giữ cấu hình của gói của bạn dưới dạng một mảng, vì vậy nếu chúng ta tưởng tượng tập tin cấu hình YAML của bạn trông như thế này:

your_bundle_name: 
    check_path: foo 

$config của bạn sẽ trông như thế:

01.
array('check_path' => 'foo') 

Vì vậy, bây giờ, tất cả những gì bạn phải làm là thêm cấu hình này vào vùng chứa. Bên load() bạn -method chỉ cần thêm một cái gì đó như:

$container->setParameter(
    'my_bundle_name.check_path', 
    $config['check_path'] 
); 

bên trong của bạn services.yml bây giờ bạn có thể sử dụng %my_bundle_name.check_path% như mọi thông số khác:

my_bundle_name.security.authentication.provider: 
    class: MyBundleName\Security\Core\Authentication\Provider\MyAuthenticationProvider 
    arguments: ['%my_bundle_name.check_path%'] 

Để biết thêm chi tiết, có một cái nhìn tại tài liệu Symfony của [1, 2]

+0

Cảm ơn Iris. Tôi biết rằng tôi thực sự có thể làm cho 'check_path' một tham số cấu hình bình thường, nhưng tôi không muốn, vì sau đó tôi phải hướng dẫn người dùng của nhóm của tôi chỉ ra' check_path' cả trong cấu hình bó và trong cấu hình cho nhà cung cấp xác thực. – Brian

+0

Tôi không hoàn toàn chắc chắn rằng tôi hiểu vấn đề của bạn? 'Check_path' sẽ được đặt trong cấu hình bó và sau đó được chuyển đến bất kỳ dịch vụ nào cần nó? –

+0

'check_path' là một tùy chọn cấu hình đặc biệt được cấu hình trong tệp' security.yml' của bạn cho một nhà cung cấp xác thực. Về cơ bản, tôi * phải * truyền nó qua tệp 'security.yml', do đó, việc thiết lập nó cho cấu hình bó của tôi là không mong muốn. – Brian

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