2013-08-17 2 views
1

Я пытаюсь установить ZfcUser с BjyAuthorize. При попытке доступа к защищенному маршруту «/ user» появляется следующая ошибка.Роль не найдена ошибка

Fatal error: Uncaught exception 'Zend\Permissions\Acl\Exception\InvalidArgumentException' with message 'Role '3' not found' in /home/brian/dev/ptapp/app/vendor/zendframework/zendframework/library/Zend/Permissions/Acl/Role/Registry.php:106 

Stack trace: 

#0 /home/brian/dev/ptapp/app/vendor/zendframework/zendframework/library/Zend/Permissions/Acl/Role/Registry.php(67): Zend\Permissions\Acl\Role\Registry->get('3') 

#1 /home/brian/dev/ptapp/app/vendor/zendframework/zendframework/library/Zend/Permissions/Acl/Acl.php(112): Zend\Permissions\Acl\Role\Registry->add(Object(Zend\Permissions\Acl\Role\GenericRole), Array) 

#2 /home/brian/dev/ptapp/app/vendor/bjyoungblood/bjy-authorize/src/BjyAuthorize/Service/Authorize.php(277): Zend\Permissions\Acl\Acl->addRole('bjyauthorize-id...', Array) 

#3 /home/brian/dev/ptapp/app/vendor/bjyoungblood/bjy-authorize/src/BjyAuthorize/Service/Authorize.php(90): BjyAuthorize\Service\Authorize->load() 

#4 /home/brian/dev/ptapp/app/vendor/bjyoungblood/bjy-authorize/src/BjyAuthorize/Service/Authorize.php(239) in /home/brian/dev/ptapp/app/vendor/zendframework/zendframework/library/Zend/Permissions/Acl/Role/Registry.php on line 69 

Мои таблицы базы данных были созданы с помощью прилагаемого schema.sql в хранилище bjyauthorize, который содержит следующий код:

CREATE TABLE IF NOT EXISTS `user_role` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `roleId` varchar(255) NOT NULL, 
    `is_default` tinyint(1) NOT NULL, 
    `parent_id` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE IF NOT EXISTS `user_role_linker` (
    `user_id` int(11) unsigned NOT NULL, 
    `role_id` int(11) NOT NULL, 
    PRIMARY KEY (`user_id`,`role_id`), 
    KEY `role_id` (`role_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

; 

С записями:

user_role

id | roleId | is_default | parent_id 
--------------------------------------------- 
1  admin   0   therapist 
2  therapist  0   patient 
3  patient   0   user 
4  guest   1   NULL 
5  user   0   NULL 

user_role_linker

user_id  role_id 
------------------- 
    3   3 

мне пришлось изменить свой файл bjyauthorize.global.php, потому что «role_id_field» и значение «parent_role_field» не совпадают с SQL схемы, представленной. Это выглядит следующим образом:

<?php 

return array(
    'bjyauthorize' => array(

     'default_role' => 'guest', 

     'identity_provider' => 'BjyAuthorize\Provider\Identity\ZfcUserZendDb', 

     'role_providers' => array(
      'BjyAuthorize\Provider\Role\ZendDb' => array(
       'table'    => 'user_role', 
       'role_id_field'  => 'roleId', 
       'parent_role_field' => 'parent_id', 
      ), 
     ), 

     'guards' => array(
      'BjyAuthorize\Guard\Route' => array(
       array('route' => 'zfcuser', 'roles' => array('user')), 
       array('route' => 'zfcuser/logout', 'roles' => array('user')), 
       array('route' => 'zfcuser/login', 'roles' => array('guest')), 
       array('route' => 'zfcuser/register', 'roles' => array('guest')), 
       // Below is the default index action used by the ZendSkeletonApplication 
       array('route' => 'home', 'roles' => array('guest', 'user')), 
      ), 
     ), 
    ), 
); 

И мой application.config.php выглядит следующим образом:

<?php 
return array(
    'modules' => array(
     'Application', 
     'ZfcBase', 
     'ZfcUser', 
     'User', 
     'BjyAuthorize', 
    ), 

    'module_listener_options' => array(
     'module_paths' => array(
      './module', 
      './vendor', 
     ), 

     'config_glob_paths' => array(
      'config/autoload/{,*.}{global,local}.php', 
     ), 
    ), 
); 

Если модуль "User" Является ли мой заказ ZfcUser Entity.

Любые идеи, в которых проблема? Я довольно новичок в ZF2 и zfc, поэтому спасибо за вашу помощь!

EDIT: Я должен отметить, что, когда я не вошел в систему, я правильно получаю 403 при попытке доступа/пользователя, когда я вошел в систему, я получаю это сообщение. Я получаю его при попытке доступа к любому маршруту (кроме недействительных маршрутов, я получаю 404)

ответ

0

Проблема, похоже, с предоставленной схемой sql. В таблице user_role_linker измените поле role_id на VARCHAR. При вводе записей в эту таблицу user_id должен соответствовать числовому идентификатору пользователя, но role_id должен быть текстовым идентификатором поля roleId в таблице user_role.

1

на основе первого комментария, после SQL работ, та же проблема существует на parent_id, вам необходимо изменить его, тоже:

CREATE TABLE IF NOT EXISTS `user_role` (
    `id` INT(11) NOT NULL AUTO_INCREMENT, 
    `role_id` VARCHAR(255) NOT NULL, 
    `is_default` TINYINT(1) NOT NULL DEFAULT 0, 
    `parent_id` VARCHAR(255) NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE INDEX `unique_role` (`role_id` ASC), 
    INDEX `idx_parent_id` (`parent_id` ASC), 
    CONSTRAINT `fk_parent_id` FOREIGN KEY (`parent_id`) REFERENCES `user_role` (`role_id`) ON DELETE SET NULL 
) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_unicode_ci; 

CREATE TABLE IF NOT EXISTS `user_role_linker` (
    `user_id` INT UNSIGNED NOT NULL, 
    `role_id` VARCHAR(255) NOT NULL, 
    PRIMARY KEY (`user_id`, `role_id`), 
    INDEX `idx_role_id` (`role_id` ASC), 
    INDEX `idx_user_id` (`user_id` ASC), 
    CONSTRAINT `fk_role_id` FOREIGN KEY (`role_id`) REFERENCES `user_role` (`role_id`) ON DELETE CASCADE, 
    CONSTRAINT `fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`) ON DELETE CASCADE 
) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_unicode_ci; 
Смежные вопросы