2011-09-22 54 views
7

Tôi đang gặp sự cố khi xác thực để hoạt động nhưng nó chỉ xuất hiện trong các trường hợp rất cụ thể. Việc xác thực được thực hiện thông qua API của bên thứ ba, vì vậy tôi đã viết lớp nhà cung cấp người dùng của riêng mình và bên trong lớp đó là một số mã đồng bộ hóa dữ liệu giữa API và Symfony, như một phần của quá trình đồng bộ hóa đó xác định vai trò người dùng nên có. Sau khi thực hiện điều này, nó thiết lập mối quan hệ giữa vai trò và người dùng thông qua mối quan hệ ManyToMany. Phương thức getRoles() trong đối tượng User của tôi lấy các đối tượng vai trò ra khỏi cơ sở dữ liệu và biến nó thành một chuỗi các chuỗi, tên vai trò đến từ cơ sở dữ liệu của tôi và tất cả bắt đầu bằng ROLE_.Xác thực không thành công trong Symfony2

Nếu tôi đăng nhập bằng tài khoản không có thêm vai trò nào thì nó hoạt động tốt, nhưng nếu tôi đăng nhập vào tài khoản có vai trò tôi vừa được gửi trở lại màn hình đăng nhập mà không có thông báo lỗi.

Tôi đã kiểm tra các bản ghi và nhìn thấy những mục này:

security.INFO: User "[email protected]" has been authenticated successfully [] [] 
event.DEBUG: Notified event "security.interactive_login" to listener "Pogo\MyBundle\Listener\LoginListener::onSecurityInteractivelogin". [] [] 
event.DEBUG: Listener "Symfony\Component\Security\Http\Firewall::onKernelRequest" stopped propagation of the event "kernel.request". [] [] 
event.DEBUG: Listener "Symfony\Bundle\FrameworkBundle\EventListener\RouterListener" was not called for event "kernel.request". [] [] 
event.DEBUG: Listener "Symfony\Bundle\AsseticBundle\EventListener\RequestListener" was not called for event "kernel.request". [] [] 
event.DEBUG: Notified event "kernel.response" to listener "Symfony\Component\Security\Http\Firewall\ContextListener::onKernelResponse". [] [] 
security.DEBUG: Write SecurityContext in the session [] [] 
event.DEBUG: Notified event "kernel.response" to listener "Symfony\Component\HttpKernel\EventListener\ResponseListener::onKernelResponse". [] [] 
event.DEBUG: Notified event "kernel.response" to listener "Symfony\Bundle\SecurityBundle\EventListener\ResponseListener::onKernelResponse". [] [] 
event.DEBUG: Notified event "kernel.response" to listener "Symfony\Bridge\Monolog\Handler\FirePHPHandler::onKernelResponse". [] [] 
event.DEBUG: Notified event "kernel.response" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\CacheListener::onKernelResponse". [] [] 
event.DEBUG: Notified event "kernel.response" to listener "Symfony\Component\HttpKernel\EventListener\ProfilerListener::onKernelResponse". [] [] 
event.DEBUG: Notified event "kernel.response" to listener "Symfony\Bundle\WebProfilerBundle\EventListener\WebDebugToolbarListener::onKernelResponse". [] [] 
event.DEBUG: Notified event "kernel.request" to listener "Symfony\Bundle\FrameworkBundle\EventListener\RouterListener::onEarlyKernelRequest". [] [] 
event.DEBUG: Notified event "kernel.request" to listener "Symfony\Bundle\FrameworkBundle\EventListener\SessionListener::onKernelRequest". [] [] 
event.DEBUG: Notified event "kernel.request" to listener "Symfony\Component\Security\Http\Firewall::onKernelRequest". [] [] 
security.INFO: Populated SecurityContext with an anonymous Token [] [] 
event.DEBUG: Notified event "kernel.exception" to listener "Symfony\Component\Security\Http\Firewall\ExceptionListener::onKernelException". [] [] 
security.DEBUG: Access denied (user is not fully authenticated); redirecting to authentication entry point [] [] 
security.DEBUG: Calling Authentication entry point [] [] 

Tôi không hiểu làm thế nào nó có thể được chứng thực ở phía trên, sau đó ngay khi nó kiểm tra các bức tường lửa mà nó tìm thấy chính nó với một thẻ vô danh đó là lý do tại sao nó có lẽ sẽ gửi tôi trở lại màn hình đăng nhập.

thiết lập tường lửa/access_control của tôi là:

firewalls: 
    public: 
     pattern: /.* 
     anonymous: true 
     tessitura_login: 
      login_path: /account/login 
      check_path: /secure/login_check 
     logout: 
      path: /secure/logout 
      target:/
access_control: 
    - { path: ^/secure/.*, role: ROLE_USER } 
    - { path: ^/admin.*, role: ROLE_ADMIN } 
    - { path: ^/account/login/?, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: /.*, role: IS_AUTHENTICATED_ANONYMOUSLY } 

Bất kỳ sự giúp đỡ với điều này sẽ được ồ ạt đánh giá cao, tôi đã dành một vài giờ trên này ngay bây giờ và tôi hoàn toàn bối rối.

+1

Tôi không cho rằng bạn đã tìm thấy câu trả lời cho vấn đề của mình? – Clint

+2

Xin lỗi Clint, có lẽ hơi muộn cho bạn nhưng nó hóa ra là trường phiên quá nhỏ. Mã đã lưu trữ khá nhiều đối tượng Doctrine trong phiên không phù hợp với trường cơ sở dữ liệu gây ra lỗi này – pogo

Trả lời

0

Tôi đã trải nghiệm tương tự. Khi người dùng của tôi đăng nhập, tôi kiểm tra xem anh ấy có vai trò gì với một vài tuyên bố như sau:

if(true === $this->get('security.context')->isGranted('ROLE_MANAGER')){ 
    //return redirect 
} 
if(true === $this->get('security.context')->isGranted('ROLE_USER')){ 
    //return redirect 
} 
//throw error 

Thỉnh thoảng một số người dùng gặp lỗi trên mặt. Tôi tưởng tượng rằng đó là vì lý do tương tự. Người dùng được xác thực bằng cách nào đó nhưng không có vai trò của họ.

Tôi không thể tự tái tạo sự cố. Tôi vừa mới nghe báo cáo lỗi từ người dùng của mình.

0

Tôi đã trải nghiệm tương tự. Và đối với tôi đó là do phân vùng/tmp đã đầy để phiên có thể được lưu trữ trên phía máy chủ và chuyển hướng avter đến nex

1

Bộ nhớ phiên bị hỏng đã gây ra sự cố này cho tôi. Tôi đã sử dụng PdoSessionHandler và thất vọng nó đã không có lỗi rõ ràng hoặc thông điệp tường trình.

0

Tôi chỉ gặp phải sự cố tương tự khi đăng nhập vào hệ thống của tôi trong đó phiên được định cấu hình để được lưu trữ trong memcache nhưng memcached không chạy. Như đã nói ở trên tiếc là nó đã không có thông báo lỗi tốt hơn.

Hy vọng rằng sẽ giúp một ai đó để tiết kiệm thời gian ;-)

0

tôi đã cùng một vấn đề với tên đăng nhập người sử dụng tôi đã sử dụng các bó sonata admin và tôi cũng đã sử dụng phiên cơ sở dữ liệu với PdoSessionHandler

session.handler.pdo: 
    class:  Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler 
    arguments: ["@pdo", %pdo.db_options%] 

vấn đề đầu tiên tôi đã nhận khi tôi tạo một nhóm với rất nhiều vai trò/quyền dữ liệu cắt ngắn trong lĩnh vực này vì vậy tôi thay đổi lĩnh vực vai trò của tôi với longtext và thay đổi ROW_FORMAT=COMPRESSED

ALTER TABLE `fos_group` CHANGE `roles` `roles` LONGTEXT NOT NULL COMMENT '(DC2Type:array)'; 
ALTER TABLE `fos_group` 
    ENGINE=INNODB 
    ROW_FORMAT=COMPRESSED 
    KEY_BLOCK_SIZE=8; 

Nó hiện công việc và tiết kiệm tất cả các vai trò/quyền vào trường như hoàn toàn sử dụng string.But serialized đã không thể đăng nhập mà không có thông báo lỗi sau đó tôi có xem lại các bản ghi được tạo ra bởi symfony app/logs dir nó có

người dùng đã được xác thực thành công

và sau đó chuyển hướng đến bảng điều khiển nhưng từ bảng điều khiển các bản ghi được tạo ra như

access denied (người dùng không phải là f ully chứng thực)

lý do là dữ liệu phiên được cắt ngắn trong bảng phiên vì vậy tôi thay đổi bảng phiên của tôi như là tốt và điều này không được công việc

ALTER TABLE `session` CHANGE `session_value` `session_value` LONGTEXT NOT NULL; 
ALTER TABLE `session` 
    ENGINE=INNODB 
    ROW_FORMAT=COMPRESSED 
    KEY_BLOCK_SIZE=8; 

Tôi cũng đã được cập nhật my.ini tập tin và thay đổi định dạng tệp cho Barracuda theo định dạng tệp mặc định là antelop

[mysqld] 
innodb_file_per_table 
innodb_file_format = Barracuda 
2

Đã xảy ra sự cố không thành công khi sử dụng số điện thoại làm tên người dùng và không chỉ định tên người dùng trongPhương pháp, phải là:

public function refreshUser(UserInterface $customer) 
{ 
    $class = get_class($customer); 

    if(!$this->supportsClass($class)) { 
     throw new UnsupportedUserException("Instances of \"{$class}\" are not supported"); 
    } 

    return $this->loadUserByUsername($customer->getPhoneNumber()); // <-- This is it! 
} 

Tôi nghĩ rằng tôi không phải là người duy nhất bỏ qua nó, có thể hữu ích.

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