0 Пользователей и 1 Гость просматривают эту тему.
  • 43 Ответов
  • 984 Просмотров
*

antarey

  • Захожу иногда
  • 105
  • 0 / 0
Добрый день.
Будет сайт коммунальной газеты, подписка хоть и копеечная но все же платная, хоть бы на хостинг хватило.
Есть две задачи :
1. Для пользователя необходимо установить срок действия логина(подписки). Если закончился срок оплаты подписки то пользователь видит только заголовки, грубо говоря стает незарегистрированным пользователем.
Как ето реализовать?
Я пробую так.
Добавил в базу пользователей два поля Date_Start & Date_End. Даты будут проставляться вручную в базе.
Только вот где в Joomle происходит сравнение введенных данных логина/пароля с полями базы данных, чтобы туда добавить еще одно условие на проверку дат?

2. Как защититься от передачи купленого логина другим лицам? Чтобы под одним логином можна было зайти только с двух устройств, к примеру с компа и мобильника.
Я ничего лучшего не придумал как добавить в базу пользователей еще одно текстовое поле типа DeviceCode. При первом логине генерируется какой-то набор символов и пишется в поле DeviceCode а на клиенте записывается в файл и уже при втором логине идет сравнение файла и поля базы.

Вопроса в принципе  2, просто для того что я придумал оба сводятся в один - где в Joomla , в каком файле и месте происходит сравнение введенных логина/пароля в форме логина с данными из базы данных?
Может кто-то посоветует как проще такие задачи реализовать или может есть готовые решения.
Мне на ru-boarde советовали https://extensions.joomla.org/extension/login-one/ но он только не дает зайти одновременно двум пользователям и плюс остается вопрос со сроком действия логина
Заранее благодарен за помощь. Прошу не сильно пинать, я с Joomla только начал разбираться
*

sivers

  • Давно я тут
  • 632
  • 62 / 0
Только вот где в Joomle происходит сравнение введенных данных логина/пароля с полями базы данных, чтобы туда добавить еще одно условие на проверку дат?
В плагин группы user в обработчике события onUserAuthenticate:
https://docs.joomla.org/Plugin/Events/Authentication#onUserAuthenticate
Перевод описания: "Это событие инициируется для проверки допустимости набора учетных данных входа." - как раз то, что вам нужно. Только вы будет сравнивать не с паролем, а с датами.
На связи в телеге @sivers
*

sivers

  • Давно я тут
  • 632
  • 62 / 0
2. Как защититься от передачи купленого логина другим лицам? Чтобы под одним логином можна было зайти только с двух устройств, к примеру с компа и мобильника.
Можно попробовать запоминать данные браузера (из $_SERVER['HTTP_USER_AGENT'] или используя класс JBrowser):
https://api.joomla.org/cms-3/classes/Joomla.CMS.Environment.Browser.html
Но не уверен, что это хорошая идея. Например, у юзера может обновиться браузер...
На связи в телеге @sivers
*

antarey

  • Захожу иногда
  • 105
  • 0 / 0
В плагин группы user в обработчике события onUserAuthenticate:
Спасибо, почитаю.
А можна как-то прочитать, сгенерировать идентификатор устройства в не зависимости от операционной системы?
*

sivers

  • Давно я тут
  • 632
  • 62 / 0
А можна как-то прочитать, сгенерировать идентификатор устройства в не зависимости от операционной системы?
http://php.net/manual/ru/function.openssl-random-pseudo-bytes.php
Генерите ключ, сохраняете в куку, потом сверяете.
Если надо 2 устройства, то запоминаете 2 ключа.
На связи в телеге @sivers
*

antarey

  • Захожу иногда
  • 105
  • 0 / 0
Генерите ключ, сохраняете в куку, потом сверяете.
Если надо 2 устройства, то запоминаете 2 ключа.
К сожалению не хватает постов чтобы поднять репутацию  *DRINK*. Куки не пойдут - любителей чистить кеш хватает, надо писать типа в мои документы, с виндой думаю проблем не будет, а вот что андроид скажет на ету тему надо проверить.
*

dmitry_stas

  • Легенда
  • 12789
  • 1199 / 8
надо писать типа в мои документы
пишите сразу в автозагрузку, че уж там )))
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

antarey

  • Захожу иногда
  • 105
  • 0 / 0
пишите сразу в автозагрузку, че уж там )))
Можна   ^-^ и туда, почитал немного и действительно куки самый удобный вариант, даже если их почистят или закончится срок действия не проблема ето предусмотреть.
Ну а вообще, можно прочитать как-то конфигурацию железа для генерации идентификатора, или проще не морлчить голову и генерировать рандомный ключ?
*

dmitry_stas

  • Легенда
  • 12789
  • 1199 / 8
гуглите fingerprint javascript. например, https://github.com/Valve/fingerprintjs2
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

antarey

  • Захожу иногда
  • 105
  • 0 / 0
гуглите fingerprint javascript. например
Ето как раз оно, спасобо большое.
*

antarey

  • Захожу иногда
  • 105
  • 0 / 0
fingerprint javascript
Вы знакомы с етой библиотекой? - если я правильно понял, для одного и того же устройства будет генерироваться постоянно один идентификатор? Вопрос в чем-надо ли идентификатор записывать на клиенте в те-же куки? В описании вроде написано, что куки не используются, но не используются для идентификации или генерации / проверки?
*

dmitry_stas

  • Легенда
  • 12789
  • 1199 / 8
смотрите, генерация происходит на клиенте. а проверку я так думаю вы будете делать на сервере. т.е. этот принт надо каким то образом передать. куки выглядят логичным решением, но не единственным.
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

antarey

  • Захожу иногда
  • 105
  • 0 / 0
@dmitry_stas
куки выглядят логичным решением
Согласен, но или  я Вас не так понял или не так задал вопрос. Просто если ета библиотека постоянно будет генерить один и тот же идентификатор до момента смены железа, то нет смысла писать куки на клиенте - раз загнал в базу и при каждом входе вызываем библиотеку и сверяем поле базы и идентификатор. Хотя вместо базы можно и в куки записать. Вопрос был именно по логике работы библиотеки-для одного и того же устройства она при каждом вызове будет генерить новый рандомный идентификатор, или же она грубо говоря читает железо вне зависимости от платформы и для одного устройства будет всегда один и тотже ключ. Просто от етих нюансов будет зависить дальнейшая реализация
*

antarey

  • Захожу иногда
  • 105
  • 0 / 0
прежде чем начать мучить Joomla еще такой вопрос - я не писал клиент-серверных приложений для винды и пока плохо понимаю логику работы веб сайта. Исходя из рекомендаций могу ли я в обработчике onUserAuthenticate сначала запустить ява скрипт тот же fingerprintjs2 сгенерить код и записать в куки, а потом дальше по коду уже на PHP делать проверки? Если  нет, и ето надо делать в двух событиях, то какое событие идет перед onUserAuthenticate ? Есть что-то типа onBeforeUserAuthenticate ?
*

passer

  • Давно я тут
  • 950
  • 74 / 3
Для начала уясните. php выполняется на веб сервере, javascript выполняется браузером. Думаю этого будет достаточно.
*

dmitry_stas

  • Легенда
  • 12789
  • 1199 / 8
Для начала уясните. php выполняется на веб сервере, javascript выполняется браузером
угу
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

antarey

  • Захожу иногда
  • 105
  • 0 / 0
@passer, @dmitry_stas

Для начала уясните. php выполняется на веб сервере, javascript выполняется браузером. Думаю этого будет достаточно
с етим разобрались, вроде ^-^, но я честно говоря не знаю структуру Joomla и не знаю куда можно впихнуть выполнение ява скрипта. Я так понимаю туда где формируется HTML код сайта, но вот куда точно?? Я без понятия.
*

dmitry_stas

  • Легенда
  • 12789
  • 1199 / 8
в index.php шаблона Joomla например. или модуль кастомный HTML сделать и вывести его на всех/нужных страницах. мы ж тоже не знаем вашу логику, где вы хотите это формировать...
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

antarey

  • Захожу иногда
  • 105
  • 0 / 0
мы ж тоже не знаем вашу логику
^-^ было-бы неплохо чтобы и я знал, я как раз хотел спросить за index. php только думал за файл в корне Joomla, а не шаблона. Мне все равно где запустить скрипт, главное чтобы перед событием авторизации пользователя onUserAuthenticate
*

dmitry_stas

  • Легенда
  • 12789
  • 1199 / 8
я как раз хотел спросить за index. php только думал за файл в корне Joomla, а не шаблона.
нет, нужен в шаблоне, а не в корне Joomla
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

antarey

  • Захожу иногда
  • 105
  • 0 / 0
нет, нужен в шаблоне, а не в корне Joomla
Понял, спасибо, пока есть чем занятся
*

SalityGEN

  • Захожу иногда
  • 130
  • 4 / 0
  • Дед Лайн
Не думаю что куки хорошая идея, проверка на клиенте это плохо!

Я бы так сделал:
клиент логиниться -> проверка есть ли такой залогиненный -> да есть -> проверка количества залогиненых с тем же user_id в бд
если больше 2 то успешный логин без записи в бд и принудительный редирект на страницу
"ошибка доступа с кнопкой разлогин всех (сброс записи в бд на 0 и разлогин)"
если меньше 2 то успешный логин и запись количества залогиненых в бд + 1
--------
С другой стороны всех разлогинит но они по прежнему будут на странице пока не обновят ее и тут как бы защита-не защита...
Можно докрутить AJAX который будет в режиме реального времени опрашивать сервер (long-pooling) и в случае чего принудительно перезагружать страницу
Но если клиент отключит js то волшебства не будет, хотя и на это можно написать проверку в <noscript>
Адаптивная верстка, создание компонентов, PHP JS программирование
*

antarey

  • Захожу иногда
  • 105
  • 0 / 0
@SalityGEN
Я на клиенте планирую только генерировать идентификатор устройства и то только в том случае если его еще нет в кукисах.
А все проверки будут на серверной стороне. Первично логин пароль, потом даты действия логина, а потом уже идентификатор.
По ходу вопрос - какое поле бд говорит о том что юзер уже залогинился?
Хотя если проверять идентификатор ето как-бы не актуально, потому как юзер тогда не сможет открыть две копии сайта на одном устройстве. Еденственное что меня беспокоит ето сохраненные пароли, я не знаю как поведет себя Joomla если в момент нового входа на сайт та же Opera подставит логин пароль и сработает автовход. Будет ли происходить событие Joomla onUserAuthenticate? По идее должно. А там не знаю
*

dmitry_stas

  • Легенда
  • 12789
  • 1199 / 8
Не думаю что куки хорошая идея, проверка на клиенте это плохо!
проверка на клиенте однозначно плохо. непонятно только при чем тут куки и проверка на клиенте? :)

Будет ли происходить событие Joomla onUserAuthenticate?
да. автосохранение в браузере не имеет никакого отношения к жумле, процесс логина ничем не отличается от того, ввели логин руками или он автоматически подставился в поле логина
« Последнее редактирование: 02.03.2019, 15:56:24 от dmitry_stas »
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

SalityGEN

  • Захожу иногда
  • 130
  • 4 / 0
  • Дед Лайн
направлю ваши мысли, вставьте код и попробуйте логиниться\разлогиниться с 2х браузеров и смотрите на вывод
Код
$user = JFactory::getUser();
if((int)$user->id > 0){
$db = JFactory::getDBO();
$query = 'SELECT * FROM #__session AS s WHERE s.userid IN ("'.$user->id.'")';
$db->setQuery($query);
$loggedin_users = $db->loadObjectList();
var_dump($loggedin_users);
}
на боевом сайте с кодом аккуратнее, т.к вывод будут видеть все!
Адаптивная верстка, создание компонентов, PHP JS программирование
*

SalityGEN

  • Захожу иногда
  • 130
  • 4 / 0
  • Дед Лайн
короч, тут и так все понятно. вот реализация, соль, перец добавить по вкусу

Код
$user = JFactory::getUser();
if(isset($_POST['userId'])){
if((int)$_POST['userId'] > 0 && (int)$_POST['userId'] == (int)$user->id){
$db = JFactory::getDBO();
$query = 'DELETE FROM `#__session` WHERE userid = '.(int)$user->id;
$db->setQuery($query);
$db->loadRowList();
Header('Location: /');
}
}

if((int)$user->id > 0){
$db = JFactory::getDBO();
$query = 'SELECT * FROM #__session AS s WHERE s.userid IN ("'.$user->id.'")';
$db->setQuery($query);
$loggedin_users = $db->loadRowList();
if(count($loggedin_users)>2){
print '<form method="POST"><button type="submit" name="userId" value="'.$user->id.'">Разлогинить всех к чертям</button></form>';
die('Превышен лимит активных пользователей');
}
}
а куками могут начать обмениваться по этому это проверка на клиенте
Адаптивная верстка, создание компонентов, PHP JS программирование
*

antarey

  • Захожу иногда
  • 105
  • 0 / 0
@SalityGEN, по коду пока только общие понятия, пока сам руками не попробую. К сожалению только учусь и многого не понимаю.
Я тут немного грамотных статей почитал и ещё больше запутался - как быть с куками для передачи сгенерированного идентификатора на яве на сторону сервера, если пользователь зайдет на сайт в режиме инкогнито? Плюс как проверить что пользователь запретил ява скрипт и не грузить сайт - таких вариантов я думаю будут еденицы, но всё же. Или пока что не забивать дурным голову?  ^-^
*

dmitry_stas

  • Легенда
  • 12789
  • 1199 / 8
как быть с куками для передачи сгенерированного идентификатора на яве на сторону сервера, если пользователь зайдет на сайт в режиме инкогнито?
а в чем проблема с передачей кук в режиме инкогнито? никакой проблемы нет, для вас

Плюс как проверить что пользователь запретил ява скрипт
ну так вы куку выставлять скриптом будете. нет яваскрипта - нет куки. нет куки - нет логина.
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

SalityGEN

  • Захожу иногда
  • 130
  • 4 / 0
  • Дед Лайн
@SalityGEN, по коду пока только общие понятия, пока сам руками не попробую. К сожалению только учусь и многого не понимаю.
Я тут немного грамотных статей почитал и ещё больше запутался - как быть с куками для передачи сгенерированного идентификатора на яве на сторону сервера, если пользователь зайдет на сайт в режиме инкогнито? Плюс как проверить что пользователь запретил ява скрипт и не грузить сайт - таких вариантов я думаю будут еденицы, но всё же. Или пока что не забивать дурным голову?  ^-^
С моим решением механизм таков:
вот есть пользователь, ему дали пароль он доволен, тут он решил поделиться своим паролем от чего сам и остальные будут не рады!
так как смотреть смогут по очереди что не совсем удобно..
Но сам пользователь может смотреть в 2х браузерах, (тут +уязвимость кстати)
к примеру - 1 телефон + 1 пк
Привязываться к железу тоже не вариант, что если пользователь на всегда сменил устройство.
JS в данном решении не используется.
Данное решение не спасет если пользователь откроет платную статью, а в соседней вкладке разлогинится и передаст пароль другому.
По такой цепочке доступ получат сколько угодно людей и им просто не стоит обновлять страницу!
Вот тут нужно заставить страницу обновиться, на помощь придет js и 1 php файлик который будет опрашиваться с необходимым интервалом и давать ответ - обновить страницу или нет.
Предположим что люди поняли что работает такой механизм и решают отрубить js
на помощь приходит
<noscript>
  <meta http-equiv="refresh" content="0;url=страница_куда_будет_послан_такой_пользователь.html">
</noscript>
в общем при отключенном js пользователя отправляем на страницу и говорим ему включи js иначе кина не будет
Адаптивная верстка, создание компонентов, PHP JS программирование
*

antarey

  • Захожу иногда
  • 105
  • 0 / 0
Привязываться к железу тоже не вариант, что если пользователь на всегда сменил устройство.
Всех вариантов не предусмотреть, смена компа / мобильника в любом слючае приведёт к ручной роботе. В моем случае требуется защита среднего уровня. Так как абсолютной защиты нет в природе, а тем более в районной газете нет ни смысла не финансов делать идеальную защиту.
Я кстати очень благодарен всем кто помогал разобраться в вопросе. Я раньше сидел на ru-boarde, но последнее время что то етот форум умерает и я честно не ожидал такого уровня поддержки на етом форуме. Дали кучу советов и пока буду пробовать реализовать то что посоветовали. Пока всем огромное спасибо за помощь, теперь от теории буду переходить к практической реализации
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Сайт для слабовидящих!

Автор vlmedia

Ответов: 141
Просмотров: 42697
Последний ответ 07.06.2019, 17:45:06
от Mick_20
Сломался сайт [Решено]

Автор Артём46

Ответов: 19
Просмотров: 171
Последний ответ 07.06.2019, 15:51:27
от Gerostrat
Вывести только определенные теги в материале, как?

Автор x1

Ответов: 4
Просмотров: 107
Последний ответ 23.05.2019, 16:07:02
от x1
Настройка срока действия пароля в Joomla

Автор ebonydabster

Ответов: 2
Просмотров: 88
Последний ответ 15.05.2019, 11:54:43
от dmitry_stas
Посоветуйте сервис или надежный компонент для подписки пуш на сайт

Автор polezniy

Ответов: 4
Просмотров: 212
Последний ответ 09.05.2019, 14:10:20
от polezniy