[switchUser] Версия 1.3.2

И вот вышла очередная версия switchUser, на этот раз, думаю, она уже стабильная, ибо пофиксил практически все, что можно. По традиции, опишу основные проблемные моменты и как с ними боролся.

В данном случае самая проблема возникла с компонентом Office. Это на самом деле очень ожидалось, как и в случае с Login и т.п. И это не проблема самих компонентов, а историческая неоднозначность самого MODX-а. Дело в том, что в MODX есть два наиболее часто используемых метода по политикам:
1. $modx->hasPermission() (Он же $modx->context->checkPolicy()) — проверка прав на контекст.
2. $modx->user->isAuthenticated() — проверка авторизованности пользователя в контексте (по умолчанию в web).

Прикол в том, что $modx->hasPermission() не проверяем авторизацию пользователя в данном контексте. Этот метод просто проверяет права пользователя, и не только не важно авторизован пользователь в этом контексте или нет, но и не важно авторизован ли пользователь вообще (то есть это может быть даже просто аноним). У пользователя или есть запрошенные права, или нету. И вот получается, что пользователь есть, и у него есть права, но компоненты, проверяющие пользователя методом $modx->user->isAuthenticated() просто не видят его в текущем контексте, из-за чего и получается путаница.

В общем, пришлось все-таки задействовать метод $modx->user->addSessionContext($modx->context->key), чтобы не просто подставлять пользователя, а именно авторизовывать его на лету. В таком случае у нас пользователь абсолютно авторизованный и куда не плюнь, везде все будет для него корректно работать.

Но здесь возникает другая проблема, с которой мы сталкивались еще в первой версии пакета — если в текущем контексте авторизован другой пользователь, то как проверять права админа (да и есть ли он вообще)? $modx->switchContext('mgr') — очень плохой вариант, ибо он не просто переключает контексты, но и перетирает системный настройки, если они прописаны в контексте. К примеру, в контексте mgr прописаны иной реквест-класс и разрешение на передачу MODX-тегов в запросах, а вот ни то, ни другое нам не нужно вообще. И даже возврат обратно в веб-контекст нас не спасает, ибо в нем этих настроек нет и потому они не могут восстановиться. При таком раскладе как минимум перестает работать фронт, потому как обработчиком становится modManagerRequest, а он совсем не так работает, как фронтовый modRequest.

И вот на эту проблему в MODX-е тоже есть решение — метод $modx->getAuthenticatedUser('mgr'). Как наверняка многим понятно, этот метод позволяет получить авторизованного пользователя из другого контекста. Метод крайне полезный и необходимый в нашем случае. А дальше все очень просто $modx->context->checkPolicy('save_user', '', $manager_user), то есть проверяем права именно для этого манагер-пользователя.

P.S. новая версия пакета выложена в modstore.pro
Fi1osof
12 декабря 2015, 16:04
modx.pro
1
1 317
+7

Комментарии: 0

Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
0