Контроль доступа

Здравствуйте, пользователи LS.
Просмотрев список доступных модулей, не обраужил модуля, который позволял бы поздавать группы юзеров. Например, обычные пользователи, которые не могли бы создавать топики, более привелегированные юзеры, модераторы. Если ли возможность реализовать подобное на LS?

20 комментариев

avatar
Реализовать можно всё =)
Зачатки подобного на LS есть, что принципе упрощает разработку.Подобное делал(делил пользователей на группы).
Могу даже я взяться, но через недельку… сейчас завален заказами.
В общем не найдёшь кто сделает. спишемся…
avatar
Было бы отлично, если бы вы поделились контактами.
avatar
Помнится кто-то заикнулся про мануал, было бы неплохо, если бы вы им все-таки поделились с общественностью :)
avatar
желание поделиться есть. чем поделиться тоже, ещё бы со временем было бы по свободнее…
avatar
Остается надеяться, что вы все-таки найдете свободную минутку для благого дела :)
avatar
Для начала внимательно глянь конфиг — иногда этого бывает достаточно.
avatar
А можно попобробнее здесь?
Просто я сам, практически не зная движка, пытаюсь тут дописать функционал. Столкнулся с той проблемой, чтоб простые юзеры не смогли писать топики, а только те, которым это разрешено. Если в шаблоне запретил вывод кнопки «написать» для обычного юзера, то всё равно остаётся такая возможность, если перейти по нужному урл.
avatar
Просто я сам, практически не зная движка, пытаюсь тут дописать функционал

А если попробовать узнать? Я ведь даже написал, с чего начать:
define('ACL_CAN_CREATE_BLOG',1); // порог рейтинга при котором юзер может создать коллективный блог
define('ACL_CAN_POST_COMMENT',-10); // порог рейтинга при котором юзер может добавлять комментарии
define('ACL_CAN_POST_COMMENT_TIME',10); // время в секундах между постингом комментариев, если 0 то ограничение по времени не будет работать
define('ACL_CAN_POST_COMMENT_TIME_RATING',1); // рейтинг, выше которого перестаёт действовать ограничение по времени на постинг комментов. Не имеет смысла при ACL_CAN_POST_COMMENT_TIME=0
define('ACL_CAN_VOTE_COMMENT',-3); // порог рейтинга при котором юзер может голосовать за комментарии
define('ACL_CAN_VOTE_BLOG',-5); // порог рейтинга при котором юзер может голосовать за блог
define('ACL_CAN_VOTE_TOPIC',-7); // порог рейтинга при котором юзер может голосовать за топик
define('ACL_CAN_VOTE_USER',-1); // порог рейтинга при котором юзер может голосовать за пользователя

define('SITE_CLOSE_MODE',false); // использовать закрытый режим работы сайта, сайт будет доступен только авторизованным пользователям
define('USER_USE_ACTIVATION',true); // использовать активацию при регистрации или нет
define('USER_USE_INVITE',false); // использовать режим регистрации по приглашению или нет. Если использовать, то регистрация будет доступна ТОЛЬКО по приглашениям!
Все строки закомментированы достаточно подробно. Вот, например, последняя строка: если чуть-чуть подумать, то можно догадаться, что если поставить там true, то регаться смогут только те, у кого приглашения есть. А у кого нет — те остаются только читателями. Этого достаточно?
avatar
Да, но ведь в этом случае пользователь вообще не сможет зарегистрироваться. А человек справшивает,
чтоб простые юзеры не смогли писать топики, а только те, которым это разрешено

По хорошему, ACL должен быть не просто модулем дополнительным, а частью ядра. Хотя можно и модулем сделать, но тогда нужно будет в каждом Action вызывать и разбираться кому-чего можно, а кому нет.
avatar
Я же не утверждаю, я всего лишь предлагаю лучше изучить движок. И, может быть, имеющегнося функционала будет достаточно для решения требуемых задач. Что значит «чтоб простые юзеры не смогли писать топики»? А что они тогда могут? Просто читать? Тогда зачем им вообще регистрироваться?

А по поводу ACL — уже поднималась тема относительно «ролей». В идеале должна быть возможность создавать «роли» со своим набором прав. Тогда, в зависимости от присвоенных «ролей» юзер и будет обладать соответствующими правами. Сейчас в ЛС этого механизма нет.
avatar
Нет, обычные юзеры должны оставлять комментарии, а юзеры, которые будут входить в спец. группу, могут создавать топики. Я создал в таблице user ещё один столбец user_group. При регистрации юзер по дефолту становится юбычным юзером, то есть не может писать топики. В шаблоне сделал вывод кнопки «написать» только юзерам доверенной группы. В профайле под ником сделал вывод группы юзера, то есть обычный или доверенный. Но осталась проблема — переход по урл /topic/add переносит на страницу с добавление топика. Здесь я немного дописал модуль user с той целью, чтобы, если обычный юзер проходит по данному урл, то происходил редирект на главную. Я хотел сделать вывод страницы 404, но не понял, как из класса user получить доступ к классу router, именно поэтому остановился на редиректе.
Я понимаю, что данное решение нельзя назвать профессиональным, поэтому и интересуюсь, как нормально решить проблему с разделением прав юзеров. Ведь, возможно, в дальнейшем, понадобится добавить ещё пару групп.
avatar
На данный момент, вся логика, связанная с контролем доступа вынесена в класс ACL (classes/acl/ACL.class.php)
Там есть функция

public function CanAddTopic(UserEntity_User $oUser, BlogEntity_Blog $oBlog){
		/**
		 * Если юзер является создателем блога то разрешаем ему постить
		 */
		if ($oUser->getId()==$oBlog->getOwnerId()) {
			return true;
		}
		/**
		 * Если рейтинг юзера больше либо равен порогу постинга в блоге то разрешаем постинг
		 */
		if ($oUser->getRating()>=$oBlog->getLimitRatingTopic()) {
			return true;
		}
		return false;
	}

В этой функции и заложена логика предоставления прав пользователям.
По-хорошему, вся проверка должна проводиться тут.
avatar
Спасибо, буду копать дальше :).
avatar
classes/modules/acl/
avatar
А ролей (кроме админа) пока нет.
Конечно же, в последствии они появятся и изменения должны касаться только класса ACL (в котором и разбирается вся логика).

Другое дело, если ты пишешь модуль, который будет автоматически ставиться, то лучше обойтись без правки «чужих» файлов. И эти методы надо выносить.
avatar
Добавил в функцию CanAddTopic проверку:
if ($oUser->getGroup() == 'user') {
return false;
}

Вывод в шаблоне кнопки «написать» так же перестал выводиться, но по урл добавления топика функционал остался доступен.
avatar
По урл появляется форма создания топика? А реально топик добавляется, если не имеющий прав юзер это делает?
avatar
Проверка идет после нажатия кнопки «опубликовать».
avatar
Т.е. юзер имеет свой собственный блог (а он создается автоматом), но не может туда писать? Нонсенс, ИМХО

как из класса user получить доступ к классу router

$this->Message_AddErrorSingle('текст_сообщения', 'заголовок сообщения');
Router::Action('error'); 
В этом случае получим не просто редирект, и не ошибку 404 (и то, и другое может вызвать недоумение юзера), а сообщение об ошибке с внятным объяснением причин
avatar
Всем спасибо, пока так меня устраивает. А к моменту, когда подумаю расширяться, нажеюсь, модуль разделения пользователей уже будет.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.