Привязка ip к login

Матеріал з NoDeny
Перейти до навігації Перейти до пошуку

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

Это число будет являться частью логина. Например, у абонента существует учетная запись ivanov и подключены 3 ip и для каждого ip выбрано число (как в видео выше):

10.0.0.205 - 1
10.0.0.206 - 3
10.0.0.207 - 4

Чтобы при авторизации по pppoe ему был выдан адрес 10.0.0.206 необходимо в качестве логина использовать ivanov+3, для 10.0.0.207 -ivanov+4

Чтобы эта схема заработала, необходимо создать mysql-процедуру, которая будет выдавать ip в зависимости от числа в фрагменте логина:

DROP FUNCTION IF EXISTS `get_ip_by_num`;
DELIMITER $$
CREATE FUNCTION `get_ip_by_num` ( user_id INTEGER UNSIGNED, num INTEGER )
    RETURNS VARCHAR(15) NO SQL
BEGIN
    DECLARE user_ip VARCHAR(15);
    DECLARE real_ip VARCHAR(15);

    SELECT INET_NTOA(ip) INTO user_ip FROM ip_pool
        WHERE uid = user_id AND type = 'static'
            AND tags LIKE CONCAT('%,', num, ',%') LIMIT 1;
    IF( user_ip IS NOT NULL ) THEN RETURN user_ip; END IF;

    SELECT INET_NTOA(ip) INTO user_ip FROM ip_pool
        WHERE uid = user_id AND type='static' LIMIT 1;
    IF( user_ip IS NOT NULL ) THEN RETURN user_ip; END IF;

    SELECT 1 INTO real_ip FROM users_services WHERE uid = user_id AND tags LIKE '%,realip,%';
    UPDATE ip_pool SET uid = user_id, `release` = UNIX_TIMESTAMP() + 300
        WHERE id = (SELECT id FROM (
            (
              SELECT id, uid FROM ip_pool 
              WHERE uid = 0 AND type = 'dynamic' AND realip = IF(real_ip>0,1,0)
              LIMIT 1
            ) UNION (
              SELECT id, uid FROM ip_pool
              WHERE uid = user_id AND type = 'dynamic' AND realip = IF(real_ip>0,1,0)
              LIMIT 1
            )
        ) AS tbl ORDER BY uid DESC LIMIT 1);

    SELECT INET_NTOA(ip) INTO user_ip FROM ip_pool
        WHERE uid = user_id LIMIT 1;
    RETURN user_ip;
END$$
DELIMITER ; 

Проверим ее работоспособность:

SELECT get_ip_by_num(357, 3);
При условии, что id абонента ivanov = 357, должно выдать:
+-----------------------+
| get_ip_by_num(357, 3) |
+-----------------------+
| 10.0.0.206            |
+-----------------------+