Как создать право доступа (permissions) не для роли, а для пользователей

Главные вкладки

Аватар пользователя iNFerNo iNFerNo 21 июня 2013 в 11:38

Как создать право доступа (permissions) не для роли, а для пользователя. Что бы потом эти права доступа можно было использовать в рулесах, во вьюхах и в своих модулях...

Хотелось бы что бы можно было бы создать право некое и потом назначать эти правила уже пользователям... и что бы эти правила были первоочередными.

т.е. если другие модули запрещают создавать какой-то тип материала, а пользовательское правило дает добро на это то юзер может создать это тип материала в обход других ограничений.

что можете посоветовать в этом вопросе? спасибо.

Комментарии

Аватар пользователя iNFerNo iNFerNo 21 июня 2013 в 11:58

Это нужно например для следующего:

есть блок, который я не хочу показывать определенным юзерам.

я хочу добавить php код видимости блока, где хочу использовать право доступа (не видеть блоки), которое можно ГДЕ ТО назначить для конкретного юзера.

Активировалось бы правило где нить на аккаунте конкретного юзера. Например в виде поля-чекбокса. Который бы тоже создавался бы.

Может быть достаточно поля чекбокса что бы огранить видимость блока? Т.е. грузим юзера проверяем поле на вкл и даем возможность видить/не видеть блок.

Но хочется одной строчкой - правом доступа.

Аватар пользователя iNFerNo iNFerNo 21 июня 2013 в 12:48
<?php
if ($account->field_subscription['und'][0]['value'] == '1') {
   return 
FALSE;
 }
else {
return 
TRUE;

}

?>

почему не работает код, чего не хватает? я его добавляю в блок в Показывать блок на определенных страницах

аккаунт юзера нужно загрузить?

Аватар пользователя iNFerNo iNFerNo 21 июня 2013 в 13:18

решил.

<?php
global $user;
$account user_load($user->uid);

if (

user_access('access mymodule') or ($account->field_hide_block_advertising[und][0][value] == '1')) {
   return 
FALSE;
 }
else {
return 
TRUE;

}

?>

остался вопрос как права доступа для юзеров создавать

так как хочется пермишенсы во вьюхе и рулесах заюзать

Аватар пользователя man-1982 man-1982 21 июня 2013 в 21:42

Можно создать отдельную роль. Назвать ее мега юзер. Выставить ей нужные пермишенсы и натолкать туда пучок нужных юзеров.
Юзеров можно толкать как в ручную так и программно. Мне думается, такой вариант правильнее впишеться в парадигму друпала. Smile

Аватар пользователя drupby drupby 22 июня 2013 в 0:33

"iNFerNo" wrote:
нет. роли не интересуют. интересно создать список прав и раздавать их юзерам напрямую. в обход ролям

добавь юзерам поле логическое или селект и там указывай их статус (vip,supervip ,супер-перец) и рулесом при изменении этого поля назначай роли
тебе правильно сказали про роли - тут логика есть
просто как их добавлять нужно подумать - я те один вариант предложил

Аватар пользователя iNFerNo iNFerNo 22 июня 2013 в 10:14

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

Аватар пользователя multpix multpix 22 июня 2013 в 10:31

"iNFerNo" wrote:
нет. роли не интересуют. интересно создать список прав и раздавать их юзерам напрямую. в обход ролям

думаю достаточно будет понять что есть роль в D.

практика:
создаем роль "редактор" включаем в нее право редактирования всех article
создаем роль "посылающий на ..." в нее право посылать на

даем васе пупкину роли редактора и посылающего - он могёт послать и отредактировать

даем лене головач роль посылающего - и она могёт только послать.

Т. о., в сложных ситуациях достаточно планировать присвоение пользователям наборов ролей.

Аватар пользователя man-1982 man-1982 22 июня 2013 в 10:57

Я понял о чем говорит Инферно, с таким сталкивался на проекте связынным с соц сетями. Инферно погляди OG и там есть модуль OG permissins - помойму так он называется. У него есть возможность доступа к определенной ноде, только членам группы. А еще админ группы может кажому посту группы выставлять права на просмотр/удалени для других челонов группы. В любом случае без самописа не обойдеться, мне так думается.
З.Ы а есть еще taxonomy acess может и он подойдет.

Аватар пользователя man-1982 man-1982 23 июня 2013 в 12:23

Так ты код, код изучи у этих модулей. А вообще hook_node_grants and hook_node_access_records - это самые лучшие друзья при организации доступа к нужной ноде.

Аватар пользователя k_dmitry k_dmitry 23 июня 2013 в 12:44

Например такой костыль:
1. Создаешь словарь таксономии "юзеры"
2. В рулсах при создании нового юзера, создаешь в словаре термин с логином юзера
3. В типе материала, добавить ссылку на термин таксономии
4. При создании ноды указывать нужные термины, они же логины юзеров
5. В ноде сделать проверку логина юзера и терминов, если совпадает то вывести ноду, если нет то показать сообщение "нету прав"

Ну или писать модуль примерно с таким функционалом...

Аватар пользователя iNFerNo iNFerNo 23 июня 2013 в 13:44

"man-1982" wrote:
Так ты код, код изучи у этих модулей. А вообще hook_node_grants and hook_node_access_records - это самые лучшие друзья при организации доступа к нужной ноде.

мне к нодам доступ не нужен...

Аватар пользователя iNFerNo iNFerNo 23 июня 2013 в 13:45

"k_dmitry" wrote:
Например такой костыль:
1. Создаешь словарь таксономии "юзеры"
2. В рулсах при создании нового юзера, создаешь в словаре термин с логином юзера
3. В типе материала, добавить ссылку на термин таксономии
4. При создании ноды указывать нужные термины, они же логины юзеров
5. В ноде сделать проверку логина юзера и терминов, если совпадает то вывести ноду, если нет то показать сообщение "нету прав"

Ну или писать модуль примерно с таким функционалом..

блин, где я хоть слово писал о доступе к ноде?

Аватар пользователя iNFerNo iNFerNo 24 июня 2013 в 8:46

"k_dmitry" wrote:
Сори, что-то не сразу понял о чем речь, посмотри вот этот модуль https://drupal.org/project/user_settings_access , по описанию, вроде то что

вощем этот модуль 2 пермишинса задает которые дополняют возможности юзеров и все.

-------

подскажите

я создал модуль. прописал там все свои пермишенсы.
можно ли на каждый пермишенс навесить свои условия и действия.

Например. Добавил пермишенс 1 к роли - роль_1, которая должна проверять заполнены ли все поля в профиле юзера. и если заполнены давать возможность например создавать ноды типа news

И что бы потом я в кастомном коде выбирал этот пермишенс для юзера и если он выполнялся то показывался блок, а если нет - не показывался бы.
А не просто если у роли юзера есть такой пермишенс то показывается, если нет - не показывается.

Аватар пользователя man-1982 man-1982 24 июня 2013 в 9:16

то есть цепочка такая роль_1 -> если поля заполнены то мы этого пользователя толкаем в роль_2 для которой есть возможность постить ноды типа news-> если пользователь по каким то либо причинам отредактировал поля и оставил их пустыми то мы его обратно переводим на роль_1 ?
hook_user_update - при редактировании пользователя
hook_user_insert - при содании нового.
hook_form_FORM_ID_alter (hook_form_user_profile_form_alter) - для добавления своего валидатора на заполнение полей.

<?php

array_unshift

($form['#validate'], 'my_validate_function');
?>

Ну как то так.

Аватар пользователя iNFerNo iNFerNo 24 июня 2013 в 12:40

"man-1982" wrote:
то есть цепочка такая роль_1 -> если поля заполнены то мы этого пользователя толкаем в роль_2 для которой есть возможность постить ноды типа news-> если пользователь по каким то либо причинам отредактировал поля и оставил их пустыми то мы его обратно переводим на роль_1 ?

Нет - роль одна у юзера.
Если поля заполнены например в профиле все то пермишенс который есть у его роли, дает возможность создавать тип ноды- новости. если не заполнены то не дает возможность создавать тип ноды - новости.

"drupby" wrote:
if(user_access('custom_permission'))

с этим все понятно, но.

нужно создать пермишенс у которого свои условия и свои действия...

еще раз напишу - МНЕ НЕ ТРЕБУЕТСЯ при наличие некого пермишенса у роли тупо разрешать что либо.

это же if(user_access('custom_permission')) значит что если у юзера не важно какой роли есть пермишенс custom_permission то он что то сделает...

но это не то что мне нужно.

Аватар пользователя iNFerNo iNFerNo 24 июня 2013 в 12:47

Привожу простой пример.

Юзер зарегистрированный и у него роль - зарегистрированный пользователь соответственно.
У юзера в аккаунте создано логическое поле типа вкл/выкл.
В своем модуле создан новый пермишенс - delete block (он вывелся в списке прав и выставлен у роли - зарегистрированный пользователь).

Требуется в своем модуле добавить логику для этого пермишенса которая решала бы задачу.

Если юзер поставил чекбокс в акаунте, то при наличие... пермишенса у его роли скрывать блок имеющий id=666.
Если не стоит галка то показывать блок с id=66 даже при наличие пермишенса

Аватар пользователя man-1982 man-1982 24 июня 2013 в 15:07
function hook_user_load($user) {

//$custom_perms - извлекаем из свое собственной базы которую мы до этого создали
// это у нас просто галочки которые на странице пользователя присутствуют. Они ведь где то хранятся?

  foreach ($custom_perms as $id =>$perm) {
    $user->custom_permp[$id] = $perm;
  }

}

function hook_block_view_alter(&$data, $block) {

  global $user;

  $user_profile = profile_user_load($user);
  //$id - определим через foreach

  if(!empty($user_profile->custom_profile[$id])) {
    // полет фантазии для блока вплоть до
    unset($data['content']);
  }

}

ну как то так

Аватар пользователя iNFerNo iNFerNo 2 июля 2013 в 12:46

Так что есть какое нить решение понятное что бы если пермишнес не назначен не одной роли эту пермишенс можно было назначить конкретному юзеру???