2013-09-06 63 views
8

Tôi đang viết một ứng dụng ajax với xác thực ajax và bây giờ tôi bắt đầu sử dụng thành phần bảo mật của symfony trong silex để xử lý xác thực/ủy quyền.
Thực hiện một thử nghiệm đơn giản với cấu hình đơn giản, tôi đi đến khu vực được bảo vệ bằng tường lửa và phản hồi tôi nhận được là chuyển hướng đến trang /login nhưng những gì tôi cần trong ứng dụng của tôi là phản hồi 401 với thông tin bổ sung có thể có (trong tiêu đề hoặc cơ thể json) về cách đăng nhập.Trả lời bảo mật của Symfony 401 thay vì chuyển hướng

$app['security.firewalls'] = [ 
    'api' => [ 
     'pattern' => '^/api', 
     'logout' => ['logout_path'=>'/auth/logout'], 
     'users' => $app->share(function(Application $app) { 
      return new MyUserProvider(); 
     }) 
    ] 
]; 

EDIT: tôi có một gợi ý nhưng tôi không chắc chắn làm thế nào để sử dụng nó. Thực hiện một điểm vào với AuthenticationEntryPointInterface Tôi có thể nói cho api cách trả lời các yêu cầu chưa được xác thực và cung cấp cho người dùng các hướng dẫn cần thiết để xác thực. Đó có thể là phản hồi 401 của tôi với hướng dẫn đăng nhập.

Trả lời

4

Điều bạn cần là trình xử lý AuthenticationEntryPoint. ví dụ đơn giản:

class AuthenticationEntryPoint implements AuthenticationEntryPointInterface { 

/** 
* Starts the authentication scheme. 
* 
* @param Request $request The request that resulted in an AuthenticationException 
* @param AuthenticationException $authException The exception that started the authentication process 
* 
* @return Response 
*/ 
public function start(Request $request, AuthenticationException $authException = null) 
{ 
    $array = array('success' => false); 
    $response = new Response(json_encode($array), 401); 
    $response->headers->set('Content-Type', 'application/json'); 

    return $response; 
} 
} 

Đăng ký lớp học như một dịch vụ trong tập tin services.xml:

<parameters> 
    <parameter key="authentication_entry_point.class">YourNameSpace\AuthenticationEntryPoint</parameter> 
</parameters> 

<services> 
    <service id="authentication_entry_point" class="%authentication_entry_point.class%"/> 
</services> 

và thực hiện một sự thay đổi nhỏ trong tập tin security.yml:

security: 
    firewalls: 
    somename: 
     entry_point: authentication_entry_point 
1

tôi đã có thể để ghi đè điểm nhập mặc định cho loại "biểu mẫu" trong tường lửa "api" như sau:

$app['security.entry_point.api.form'] = $app->share(function() use ($app) { 
    return new MyAuthenticationEntryPoint(); 
}); 

Sau đó, nó chỉ là vấn đề thực hiện AuthenticationEntryPointInterface:

http://symfony.com/doc/current/components/security/firewall.html#entry-points

Có xem xét việc thực hiện symfony để có được một ý tưởng:

Symfony\Component\Security\Http\EntryPoint\FormAuthenticationEntryPoint 

Ngoài ra, có thể là giá trị kiểm tra ra silex nhà cung cấp dịch vụ bảo mật để xem cách họ tiêm vào "security.entry_point.form._proto" triển khai mặc định.

Silex\Provider\SecurityServiceProvider