2011-11-30 28 views
6

Tôi muốn buộc người dùng sử dụng HTTPS thay vì HTTP nhưng chỉ sau khi xác thực. Tùy chọn duy nhất tôi tìm thấy là buộc HTTPS trên mỗi bộ điều khiển/phương thức cơ sở. Người dùng ẩn danh chỉ nên sử dụng HTTP.Symfony2, chuyển sang HTTPS sau khi xác thực

Làm cách nào để đặt lực-HTTPS chỉ cho người dùng được xác thực và KHÔNG sử dụng HTTPS cho người dùng chưa được xác thực trong tất cả các bộ điều khiển trong nhóm của tôi?

Một lần nữa - đây không phải là việc vô hiệu hóa HTTPS cho trang ủy quyền.

Tôi muốn sử dụng tất cả các bộ điều khiển tương tự cho người dùng được xác thực và chưa được xác thực nhưng buộc những người dùng đã đăng nhập để sử dụng HTTPS và những người không sử dụng HTTP. Về cơ bản, thêm yêu cầu cho HTTPS cho TẤT CẢ bộ điều khiển khi người dùng được xác thực.

Câu hỏi này dành riêng cho Symfony 2. Tôi muốn làm điều đó bằng cách sử dụng cơ chế Symfony. Tôi biết làm thế nào để phát hiện điều này, nhưng nó sẽ phá vỡ các liên kết Twig. Symfony có thể tự động chuyển sang HTTPS, tôi chỉ muốn biết làm thế nào để làm điều đó trên cơ sở vai trò cho mỗi người dùng, không phải trên cơ sở điều khiển.

+0

Bạn có câu hỏi không? – JJJ

+1

Không sử dụng HTTPS để xác thực là quyết định BAD. Nó có nghĩa là dữ liệu được gửi/nhận là văn bản thuần và bất kỳ ai có quyền truy cập vào bất kỳ máy nào trong tuyến giữa máy khách và máy chủ của bạn sẽ có thể đọc các gói và thu thập thông tin xác thực (người dùng, thẻ, cookie, v.v ...). Có lý do đặc biệt nào khi không sử dụng SSL để xác thực không? – jweyrich

+2

@jweyrich Đây không phải là câu hỏi. Tôi muốn người dùng sử dụng https cho tất cả các trang tiếp theo sau khi ủy quyền (là bên ngoài btw) và vô hiệu hóa https cho người dùng trái phép. –

Trả lời

10

Chúng tôi từng nghĩ bộ điều khiển truy cập sẽ làm điều này cho chúng ta:

access_control: 
    - { role: ROLE_USER, requires_channel: https } 
    - { role: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: http } 

Nhưng, không ... Tôi nghĩ rằng đây sẽ là một tính năng rất đẹp mặc dù.

Trong trường hợp đó, chúng ta có thể hack cái gì cùng với một yêu cầu người nghe bằng sự kiện hạt nhân:

namespace YourBundle\EventListener; 

use Symfony\Component\HttpKernel\Event\GetResponseEvent; 
use Symfony\Component\HttpFoundation\RedirectResponse; 

class RequestListener 
{ 
    public function onKernelRequest(GetResponseEvent $event) 
    { 
     $request = $event->getRequest(); 

     // force ssl based on authentication 
     if ($this->container->get('security.context')->isGranted('IS_AUTHENTICATED_FULLY')) { 
      if (!$request->isSecure()) { 
       $request->server->set('HTTPS', true); 
       $request->server->set('SERVER_PORT', 443); 
       $event->setResponse(new RedirectResponse($request->getUri())); 
      } 
     } else { 
      if ($request->isSecure()) { 
       $request->server->set('HTTPS', false); 
       $request->server->set('SERVER_PORT', 80); 
       $event->setResponse(new RedirectResponse($request->getUri())); 
      } 
     } 
    } 
} 

Xác định người nghe của bạn trong config.yml dưới các dịch vụ:

myapp.request.listener: 
    class: MyApp\MyBundle\EventListener\RequestListener 
    tags: 
     - { name: kernel.event_listener, event: kernel.request } 

Xem Symfony Internals biết chi tiết về các sự kiện và những thứ tương tự.

+1

Bạn có thể kiểm tra gói của chúng tôi cho phép các hành vi tự động như buộc ssl cho người dùng đã đăng nhập, mà không cấp 403 nếu họ truy cập trang web mà không https: https://github.com/nelmio/NelmioSecurityBundle – Seldaek

2

Trong Symfony 2.0.11 tôi gặp lỗi chuyển hướng. Để giải quyết điều này, tôi đã nhận xét các dòng sau trong trình nghe.

class RequestListener { 
    public function onKernelRequest(GetResponseEvent $event) { 
     $request = $event->getRequest(); 

     // force ssl based on authentication 
     if  ($this->container->get('security.context')->isGranted('IS_AUTHENTICATED_FULLY')) { 
      if (!$request->isSecure()) { 
       $request->server->set('HTTPS', true); 
       $request->server->set('SERVER_PORT', 443); 
       // $event->setResponse(new RedirectResponse($request->getUri())); 
      } 
     } else { 
      if ($request->isSecure()) { 
       $request->server->set('HTTPS', false); 
       $request->server->set('SERVER_PORT', 80); 
       // $event->setResponse(new RedirectResponse($request->getUri())); 
      } 
     } 
    } 
} 
Các vấn đề liên quan