2012-11-06 2 views
1

У меня есть модель 'User', которая связана с моделью 'Group' через отношения HABTM. Я могу запросить модель, чтобы определить, к каким членствам принадлежит аутентифицированный пользователь, но я не могу концептуально придумать способ легкого доступа к этим данным в вызове функции isAuthorized().Пользовательские разрешения от HABTM отношений

В идеале я надеюсь, что у меня есть способ связать метод аутентификации и кешировать членство в группе авторизованного пользователя, чтобы я мог быстро просмотреть вызовы isAuthorized(). Есть ли какая-то функциональность в торте, которая позволит это? Я, очевидно, открыт для рекомендаций, поскольку я довольно новичок в структуре после наследования этого проекта от прошлого сотрудника.

Из того, что я смог собрать, я хотел бы иметь возможность доступа или поиска членов группы пользователей, возвращаемых AuthComponent::user(), но поскольку это статический метод, я не получаю доступ к его модели. Это возможно?

EDIT: раствор представляет собой смесь из обсуждения я имел с РПС, а также выяснить, что приложение, казалось, нарушить проверку подлинности. Это может быть ошибка последнего разработчика, который создал приложение, но мне удалось его решить, переопределив часть BaseAuthenticate. _findUser($username,$password) Функция для наследования массива «Группа» вместе с массивом «Пользователь». Он запрашивался при входе в систему, но только часть «Пользователь» возвращалась обратно в контроллер, который назывался Auth.

+0

Вы используете Cake 2.x, справа?Вы пытаетесь реализовать [настраиваемый объект авторизации] (http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html#creating-custom-authorize-objects)? – ndm

+0

Я использую 2.x, но не думаю, что это пользовательский объект. Аутентификация пользователя, которую я использую, отлично работает и достигает всех моих целей, за исключением членства в группах. Мне нужен какой-то способ иметь глобальный доступ к модели «Пользователь» таким образом, чтобы я мог запрашивать группы пользователей на любом контроллере. – Grambot

+0

А, хорошо, так что вам нужно, изнутри какого-либо контроллера, восстановить группы текущего пользователя? – ndm

ответ

3

Уход за группами пользователей, которые в настоящее время вошёл в систему, должен быть простым, вам нужно просто настроить свой authentication handler так, чтобы он извлекал связанные модели. Это можно сделать, используя настройку resurive или contain, хотя последнее, похоже, сейчас разбито (по крайней мере, поведение неожиданно).

Пример использования recursive:

$this->Auth->authenticate = array 
(
    'Form' => array 
    (
     'userModel' => 'User', 
     'recursive' => 1 
    ) 
); 

примере с помощью contain:

$this->Auth->authenticate = array 
(
    'Form' => array 
    (
     'userModel' => 'User', 
     'contain' => array('Group') 
    ) 
); 

Для того, чтобы метод contain на работу, User модель должна действовать как Containable! Однако, как уже упоминалось, это, кажется, сломано, потому что recursive is always used, и невозможно установить его на null, потому что он отливается целым числом. Таким образом, вам нужно будет также указать соответствующую настройку recursive (т. Е. Рекурсивную = 1), однако это как-то нарушает цель поведения Containable, которое должно автоматически определять соответствующий рекурсивный параметр (если не задано иное).

Как бы то ни было, оба сделают аутентификатор для вашего User HABTM Group ассоциации. В любом случае, то вы должны быть в состоянии получить доступ к данным через AuthComponent::user() из любого места вы хотите:

$currentUser = AuthComponent::user(); 
pr($currentUser['Group']); 

Edit (07.11.2012): Проблема с использованием contain в конфигурации обработчика аутентификации теперь fixed for 2.2.4 , что позволяет пройти null для настройки recursive.

+0

Где я могу вставить этот код? Единственная ссылка, которую я нашел, которая кажется подходящей, находится в 'AuthComponent.php' – Grambot

+0

Это очень зависит от вашего приложения, но обычно оно идет либо в обратном вызове' beforeFilter' контроллера, где вы включаете компонент 'Auth', либо настройки передаются непосредственно в конфигурацию 'Auth' [компонент конфигурации] (http://book.cakephp.org/2.0/en/controllers/components.html#configuring-components) в свойстве' $ components', см. также [Настройка Обработчики проверки подлинности] (http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html#configuring-authentication-handlers). – ndm

+0

Поцарапать это. Я поместил его в 'beforeFilter()' на 'AppController.php', но не получил никаких новых полей в' AuthComponent :: user() ', глядя на него с помощью' debug() ' – Grambot

Смежные вопросы