🚀 实验环境:

  • 网关:RouterOS v7.19.4
  • 认证:TekRADIUS v5.7
  • 数据:SQL Server 2008 R2 Enterprise

使用 SQL Server 触发器(Trigger)方案,专门为 TekRADIUS 认证系统设计。它的核心功能是:在用户第一次成功拨号上网时,自动将其当前的 MAC 地址与账号绑定,以及排除特殊账号,实现“首次登录自动锁死硬件”的效果。

USE TekRADIUS;
GO

IF OBJECT_ID('BindMacOnFirstLogin', 'TR') IS NOT NULL
    DROP TRIGGER BindMacOnFirstLogin;
GO

CREATE TRIGGER BindMacOnFirstLogin
ON dbo.Accounting
AFTER INSERT
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @UserName NVARCHAR(128);
    DECLARE @Mac NVARCHAR(64);

    SELECT TOP 1 
        @UserName = UserName, 
        @Mac = CallingStationId
    FROM inserted
    WHERE CallingStationId IS NOT NULL AND UserName IS NOT NULL;

    -- 排除 111 和 aaa 用户
    IF @UserName NOT IN ('111', 'aaa')
    BEGIN
        -- 检查该用户是否已经绑定 MAC
        IF NOT EXISTS (
            SELECT 1 FROM dbo.Users
            WHERE UserName = @UserName AND Attribute = 'ietf|31'
        )
        BEGIN
            -- 插入绑定信息
            INSERT INTO dbo.Users (UserName, Attribute, AttrType, Val)
            VALUES (@UserName, 'ietf|31', 0, @Mac);

            PRINT '首次拨号自动绑定 MAC 成功:' + @UserName + ' → ' + @Mac;
        END
    END
    ELSE
    BEGIN
        PRINT '跳过账号:' + @UserName + '(不进行 MAC 绑定)';
    END
END;
GO

📌 以下是代码的详细逻辑拆解:

  1. 环境准备
  • USE TekRADIUS;:切换到 TekRADIUS 的数据库。
  • IF OBJECT_ID...DROP...:如果数据库里已经存在名为BindMacOnFirstLogin的触发器,先把它删掉,方便重新创建(防止冲突)。
  1. 触发条件
  • ON dbo.Accounting:监控Accounting(计费/日志)表。
  • AFTER INSERT:每当该表有新记录插入(通常意味着有人尝试上线或产生了计费请求)时,触发器就会运行。
  1. 核心逻辑(BEGIN...END块)

    代码通过以下步骤处理自动化绑定:

  • 获取用户信息:
    从刚插入的数据(inserted表)中提取UserName(用户名)和CallingStationId(在 RADIUS 协议中,这通常代表用户的 MAC 地址)。

  • 白名单过滤:
    IF @UserName NOT IN ('111', 'aaa'):如果是111aaa,则跳过不绑定。这防止了公共账号被意外锁死在某台设备上。

  • 检查是否已绑定:
    查询dbo.Users表,看看这个用户是否已经存在属性为ietf|31(这是 RADIUS 中代表Calling-Station-Id即 MAC 绑定的属性代码)的记录。

  • 执行绑定:
    如果该用户还没绑定过 MAC,触发器会自动向dbo.Users表插入一条新指令,将该用户的Val(值)设定为当前的 MAC 地址。

🤔 这段代码的作用是“懒人管理”:

管理员不需要手动收集每个人的 MAC 地址。用户领到账号后,第一次拨号时,系统会自动抓取他手机或电脑的 MAC 并写入数据库。从第二次开始,如果该用户换了一台设备拨号,由于 MAC 地址与数据库不匹配,TekRADIUS 将会拒绝其登录。