shape1
shape2
shape3
shape4
shape7
shape8

Админ-Система /alogin как на самп рп или в подобии

  • Автор темы DayPlays
  • Дата начала

D

DayPlays

Гость
Гость
Плюсы:

  • Система основных и гостевых серверов.
  • Удобно для владельцев нескольких серверов.
  • Защита от в3лома админов (если злоумышленник узнает пароль на гостевом сервере и его алогин, то он не сможет войти.
  • Пароль от админки одинаковый на всех серверах.
  • Ставить/Снимать/Повышать админов находясь далеко от компьютера, с мобильного устройства, управление через сайт (исходники ПУ пока не предоставляю, в .php файлах быдлокод).
  • Организация уровней админки на гостевых серверах.
  • Можно синхронизировать с вашим ЛК, мониторингом, и т.д.


Минусы:

  • На владельцев только одного сервера, хватило бы простого значения в переменной админки.
  • Для кого как...


Теория
После ввода пароля в /alogin, отправляется HTTP запрос на наш гейт, гейт решает выдавать ли пользователю админку, вернет ошибки или уровень админки, даже дело за модом.
Если у игрока пароль "255", записываем в его таблицу пароль, который он ввел.
Если у игрока нет админки - вернем "NO", При неверном пароле, возвращаем ошибку "PI", если игрок пытался авторизоваться на гостевом сервере, не сбив IP адрес на основном, выдаем ошибку "IC", пройдя эти проверки, вернем нужный лвл админки, в зависимости от сервера.
У меня такая система:
1 lvl основа, 1 гостевой.
2 lvl основа, 1 гостевой.
3 lvl основа, 2 гостевой.
4 lvl основа, 2 гостевой.
5 lvl основа, 2 гостевой.
6 lvl основа, 4 гостевой.
7 и выше - не меняется.

Далее мод вернет ошибку, или установит лвл админки.

Практика
Нам понадобится:
1. Любой хостинг с MySQL, PHP
2. Сам сервер с готовым модом

Работы на хостинге:
Нам надо придумать секретный ключ, пусть это будет "effre4f45f43d"

Создам таблицу и БД на хостинге, вот дамп таблицы:

-- phpMyAdmin SQL Dump
-- version 3.5.8.2
-- http://www.phpmyadmin.net
--
-- Хост: localhost
-- Версия сервера: 5.5.37-cll-lve
-- Версия PHP: 5.4.28

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- База данных: `admin`
--

-- --------------------------------------------------------

--
-- Структура таблицы `admin`
--

CREATE TABLE IF NOT EXISTS `admin` (
`nick` varchar(32) COLLATE cp1251_bin NOT NULL,
`password` varchar(17) COLLATE cp1251_bin NOT NULL,
`level` int(11) NOT NULL,
`server` int(11) NOT NULL,
`lastlogin` varchar(30) COLLATE cp1251_bin NOT NULL,
`lastserver` varchar(30) COLLATE cp1251_bin NOT NULL,
`lastIP` varchar(17) CHARACTER SET cp1250 COLLATE cp1250_bin NOT NULL,
`id` int(11) NOT NULL,
`UnixLastLogin` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 COLLATE=cp1251_bin;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;


Создадим гейт atest.php:

<?php

function SuccessLogin($level, $ip, $server, $nick)
{
mysql_query("UPDATE `admintest` SET `lastserver` = '$server', `lastIP` = '$ip', `UnixLastLogin` = UNIX_TIMESTAMP() WHERE `nick` = '$nick'");
echo"$level";
mysql_close();
exit;
}

function SetPassword($nick, $password)
{
mysql_query("UPDATE `admintest` SET `password` = '$password' WHERE `nick` = '$nick'");
}

if($_GET['skey'] == "ВАШ_СЕКРЕТНЫЙ КЛЮЧ")
{
$nick = $_GET['nick'];
$password = $_GET['password'];
$server = $_GET['server'];
$playerip = $_GET['ip'];
$l=mysql_connect("localhost", "ЮЗЕР", "ПАРОЛЬ");
mysql_select_db("admin");
$sql = "SELECT * FROM `admintest` WHERE `nick` = '$nick'";
$result = mysql_query($sql);
if(mysql_num_rows($result) == 0) die("NO|0"); //не админ
$row = mysql_fetch_assoc($result);
if($row['password'] == "255")
{
SetPassword($nick, $password);
$row['password'] = $password;
}
if($password != $row['password']) die("PI|0"); //неверный пароль
if($server == $row['server']) SuccessLogin($row['level'], $playerip, $server, $nick); //игрок зашел под админку на основном сервере, пускаем.
else //гостевой сервер
{
if($playerip != $row['lastIP']) die("IC|0"); //ип сменился, зовем игрока на основной сервер
switch($row['level'])
{
case 1: SuccessLogin(1, $playerip, $server, $nick);
case 2: SuccessLogin(1, $playerip, $server, $nick);
case 3: SuccessLogin(2, $playerip, $server, $nick);
case 4: SuccessLogin(2, $playerip, $server, $nick);
case 5: SuccessLogin(2, $playerip, $server, $nick);
case 6: SuccessLogin(4, $playerip, $server, $nick);
default: SuccessLogin($row['level'], $playerip, $server, $nick);
}
}
}
else die("IK");

?>



И напишите простой ПУ для управления у админами.

Перейдем в Pawn код:
Для начала, создадим в массиве PlayerInfo переменную "pBeAdmin", заменяем получение и запись в нее из обычного MySQL поля "pAdmin".

Объявим переменные:

new PlayerAlogin[MAX_PLAYERS]; // эту обновлять при OnPlayerConnect
new serveridthis = 2; //а тут храним номер сервера


Сделаем команду /alogin:

CMD:alogin(playerid, params[])
{
if(!AcceptWrite(playerid)) return 1; //залогинился ли игрока
if(PlayerAlogin[playerid]) return ShowPlayerDialog(playerid,DIALOGINFO,0,"Админ авторизация","{6347AA}Вы уже отправили запрос","Закрыть","");//если запрос еще не обработан
ShowPlayerDialog(playerid,153,DIALOG_STYLE_PASSWORD,"Админ авторизация","Введите пароль\n\nПароль должен состоять из латинских букв и цифр\n\tразмером от 6 до 15 символов","Вход","Отмена");
return 1;
}


В OnDialogResponse:

case 153:
{
if(response){
if(!strlen(inputtext)) return ShowPlayerDialog(playerid,153,DIALOG_STYLE_PASSWORD,"Админ авторизация","Введите пароль\n\nПароль должен состоять из латинских букв и цифр\n\tразмером от 6 до 15 символов","Вход","Отмена");
if(strlen(inputtext) < 6 || strlen(inputtext) > 15) return ShowPlayerDialog(playerid,153,DIALOG_STYLE_PASSWORD,"Админ авторизация","Введите пароль\n\nПароль должен состоять из латинских букв и цифр\n\tразмером от 6 до 15 символов","Вход","Отмена");
if(IsPassInvalid(inputtext)) return ShowPlayerDialog(playerid,153,DIALOG_STYLE_PASSWORD,"Админ авторизация","Введите пароль\n\nПароль должен состоять из латинских букв и цифр\n\tразмером от 6 до 15 символов","Вход","Отмена");
new count1;
for (new i; i < strlen(inputtext); i++)
if (inputtext >= '0' && inputtext <= '9')
count1++;
if(count1 == 0) return ShowPlayerDialog(playerid,153,DIALOG_STYLE_PASSWORD,"Админ авторизация","Введите пароль\n\nПароль должен состоять из латинских букв и цифр\n\tразмером от 6 до 15 символов","Вход","Отмена");
if(strlen(inputtext) == count1) return ShowPlayerDialog(playerid,153,DIALOG_STYLE_PASSWORD,"Админ авторизация","Введите пароль\n\nПароль должен состоять из латинских букв и цифр\n\tразмером от 6 до 15 символов","Вход","Отмена");
if(!strcmp(pData[playerid][pPassword], inputtext, true)) return ShowPlayerDialog(playerid,DIALOGINFO,DIALOG_STYLE_MSGBOX,"Админ авторизация","Пароль не должен совпадать с игровым","Закрыть","");
PlayerAlogin[playerid] = 1;
format(httpquery,sizeof(httpquery),"ВАШ_САЙТ.ru/getadm.php?skey=ВАШ_СЕКРЕТНЫЙ КЛЮЧ&nick=%s&password=%s&server=%d&ip=%s",getName(playerid), inputtext, serveridthis, GetIP(playerid));
HTTP(playerid, HTTP_GET, httpquery, "", "ForAdminLogin");
}
}






Создадим паблик:

forward ForAdminLogin(index, response_code, data[]);
public ForAdminLogin(index, response_code, data[])
{
if(response_code == 200)
{
if(!PlayerAlogin[playerid]) return SendClientMessage(index, COLOR_GREY, "Ошибка входа"); //возможно игрок пытался в3ломать систему
PlayerAlogin[index] = 0;
if(!strcmp(data,"IK",true,2)) return SendClientMessage(index, COLOR_GREY, "Неизвестная ошибка");
if(!strcmp(data,"NO",true,2)) return SendClientMessage(index, COLOR_GREY, "Вы не модератор");
if(!strcmp(data,"PI",true,2)) return SendClientMessage(index, COLOR_GREY, "Вы ввели неверный пароль"),ASendMes(1,0xF4B800AA,"<ALogin> %s[%d] ввел неверный пароль",getName(index),index);
if(!strcmp(data,"IC",true,2)) return SendClientMessage(index, 0x9F0000FF, "Ваш IP сменился, авторизируйтесь на своем основном сервере");
new admlvl = strval(data);
pData[index][pBeAdmin] = admlvl; //для автобана, не используйте эту переменную для проверки наличия админки
pData[index][pAdmin] = admlvl; //сам лвл админки
PlayerAlogin[index] = 0;
SendMes(index,0xF4B800AA,"Вы авторизировались как модератор %d уровня",admlvl);
if(admlvl < 7) ASendMes(1,0xF4B800AA,"<ALogin> вошел %s[%d]",getName(index),index);
}
else
{
return PlayerAlogin[index] = 0,ShowPlayerDialog(index,DIALOGINFO,0,"Ошибка","Ошибка соединения! Повторите позже","Закрыть","");
}
return 1;
}



Всё готово. Код может затребовать функции, которых нету в некоторых модах, их можно написать самим, или заменить на свои.
Автор: Голубь