Эксперименты

Учёт логинов в MySQL базе данных

2011.08.06

Иногда связок логин/пароль становится так много, что даже записанные на отдельной бумажке (в отдельном текстовом файле) они занимают больше экрана места. Вчера меня это достало и я воспользовался тем, что на моей машине работает MySQL сервер. Сегодня мы с вами делаем простую систему для учёта учётных записей в MySQL базе данных.

Создание базы данных и таблицы логинов

    CREATE DATABASE my DEFAULT CHARACTER SET UTF8;
    USE my;
    CREATE TABLE logins (
      id INT UNIQUE AUTO_INCREMENT PRIMARY KEY,
      hostname VARCHAR(255) CHARACTER SET UTF8,
      type VARCHAR(255),
      address VARCHAR(255),
      login VARCHAR(255) CHARACTER SET UTF8,
      password VARCHAR(255) CHARACTER SET UTF8,
      alias VARCHAR(255) CHARACTER SET UTF8
    );

Теперь у нас есть база данных my (подошла бы любая, но я решил создать отдельную для подобных игр с SQL). В этой базе есть таблица logins, поля которой имеют следующее назначение (id я пропускаю, такое поле должно быть в любой таблице).

  • hostname:
    Адрес сервера, к которому относится логин. Лично я для простоты пишу без http://, и указываю https:// перед адресом только если подключение явно осуществляется по HTTPS

  • type:
    Тип подключения. В моей ментальной модели учётных записей существуют следующие типы подключений:

    • http:
      Подключение к веб-сайту через браузер, обычно такие пароли — от админских панелей веб-сайтов

    • ftp:
      FTP подключение.

    • panel:
      Это подключения к админской панели учётной записи на хостинге.

    • mysql:
      Пароли от MySQL серверов напрямую

    • phpmyadmin:
      Подключение к phpMyAdmin. Бывает, что напрямую подключение к MySQL серверу запрещено, а взаимодействие с БД осуществляется через интерфейс phpMyAdmin. В таком случае получается, что логины/пароли — от базы данных, а адрес относится к Сети, а не к Интернету. :)

  • address:
    Адрес на сервере [hostname], который относится к учётной записи. Я пишу сюда путь до админской панели в случае [type] == "http", и название каталога на FTP сервере в случае [type] == "ftp". Для [type] == "mysql" и [type] == "phpmyadmin" сюда можно писать название базы данных. В общем, полезное поле.\

  • alias:
    Вряд ли вы веб-сайты, к которым у вас есть учётные записи, называете по [hostname]. Это поле содержит запоминающееся название этого веб-сайта. Оно очень важно, потому что поиск, который мы сделаем в сделующем разделе, будет искать по альясам.

Поиск по базе

В целом, на этом можно было бы поставить точку, потому что теперь с помощью обычных SQL запросов можно делать со своим списком логинов всё, что заблагорассудится. Добавление в таблицу новой учётной записи делается так:

    INSERT INTO logins (alias, hostname, type, login, password, address)
      VALUES ('Рога и Копыта', 'kopyt.xx', 'http', 'batras', 'TOPSECRET', '/bx/admpanel');

Извлечение из таблицы сведений делается, например, так:

    SELECT type, hostname, login, password, address FROM logins
      WHERE alias like '%Копыт%';

Однако, это, конечно, ужасно. Я всегда ищу по альясам, а типов не так уж и много, переживу, если СУБД мне выдаст не одну строчку, а пять. Поэтому воспользуемся PL-SQL и создадим процедуру, которая уменьшит требуемое количество набираемых символов.

    DELIMITER //
    CREATE PROCEDURE find_login(IN alias_str VARCHAR(255))
    BEGIN
      SELECT type, hostname, login, password, address FROM logins
        WHERE alias LIKE CONCAT('%', alias_str, '%');
    END//

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

    CALL find_login('Копыт');

Здесь я DELIMITER вернул обратно, конечно же. :) Всё, теперь жить можно. Аналогично можно сделать процедуру для укорочения INSERT INTO, но я думаю, что это уже жлобство.

Предыдущий: 29 способов оставаться креативным Следующий: Учёт логинов в MySQL базе данных часть 2: поиск прямо из Bash