2012-10-03 22 views
6

Tôi đang theo dõi http://symfony.com/doc/current/cookbook/security/voters.html và cố gắng thực hiện một cử tri tùy chỉnh từ chối truy cập cho các yêu cầu không chứa khóa API hợp lệ và thông báo trong tiêu đề (bị ảnh hưởng bởi http://symfony.com/doc/current/cookbook/security/custom_authentication_provider.html - Tôi không xây dựng nhà cung cấp xác thực vì tôi cần sử dụng nhà cung cấp FOSUserBundle cho cùng một yêu cầu).Làm cách nào để đưa nhà cung cấp người dùng trong bộ nhớ vào một dịch vụ?

Tôi muốn lưu trữ khóa/bí mật api của mình trong nhà cung cấp người dùng trong bộ nhớ để bắt đầu và có khả năng di chuyển sang nhà cung cấp mongodb tùy chỉnh sau này. Vì vậy, tôi cần một cách để đưa nhà cung cấp người dùng vào cử tri của tôi. Tôi đã tiêm container dịch vụ, nhưng các nhà cung cấp người dùng có thể được truy cập từ nó không?

định nghĩa vụ của tôi:

services: 
    security.access.api_client_voter: 
     class:  Acme\RestBundle\Security\Authorization\Voter\ApiClientVoter 
     arguments: [@service_container, %kernel.cache_dir%/security/nonces] 
     public: false 
     tags: 
      - { name: monolog.logger, channel: authentication } 
      - { name: security.voter } 

Vì vậy, câu hỏi của tôi là, làm thế nào để tôi tiêm các nhà cung cấp trong bộ nhớ? Ví dụ WSSE trong sách dạy nấu ăn dường như sử dụng một nhà máy cung cấp auth để thay thế chuỗi 'security.providers.in_memory', nhưng khi tôi chỉ sử dụng một cử tri, điều này có cần thiết không? Nếu nó là cần thiết, nhà máy của tôi sẽ trông như thế nào?

Trả lời

7

Nhà cung cấp người dùng trong bộ nhớ đầu tiên được định nghĩa là dịch vụ trừu tượng trong số security.xml của SecurityBundle. Dựa trên cấu hình của nhà cung cấp người dùng của bạn theo số security.yml, số SecurityExtension của SecurityBundle sau đó tạo dịch vụ nhà cung cấp dịch vụ người dùng trong bộ nhớ cụ thể mà mỗi người dùng sẽ được thêm làm dịch vụ. Như bạn có thể thấy, tên của dịch vụ này sẽ là security.user.provider.concrete.[name-of-your-firewall]. Vì vậy, có thể sử dụng dịch vụ này trong hoặc tiêm dịch vụ này vào cử tri của bạn. Bạn luôn có thể xem trong thùng chứa dịch vụ đã bán phá giá trong thư mục /app/cache của bạn để tìm hiểu tên của các dịch vụ và liệu chúng có được xác định hay không.

6

Các trong bộ nhớ tên nhà cung cấp dịch vụ sử dụng là security.user.provider.concrete.in_memory nhưng dịch vụ là tư nhân, do đó, bạn cần phải xác định một bí danh cho nó trong config.yml:

services: 
    in_memory_user_provider: 
     alias: security.user.provider.concrete.in_memory 

Bây giờ, bạn có thể truy cập vào nó như in_memory_user_provider.

+1

Cả hai câu trả lời tương tự vì vậy tôi đã chấp nhận là người đầu tiên, nhưng thanks for the info thêm về việc sử dụng một bí danh. –

0

Dịch vụ này đã được công bố

<service id="security.user.provider.in_memory" class="Symfony\Component\Security\Core\User\InMemoryUserProvider" abstract="true" /> 
Các vấn đề liên quan