FreeRadius 链接 MySQL,字段username可否支持中文?(pfsense freeradius mysql)

在 pfsense 里搭建了 freeradius 插件,外链了 Mysql 数据库,测试Radius 认证,添加英文用户能正常认证,添加 username 为中文名的账户,总是认证失败,看记录提交检验的 username 成乱码。主要用来做 web 认证用,希望 username 是中文的,各位有解决办法吗?

设置字符集

SHOW VARIABLES LIKE 'character_set_%';
SHOW VARIABLES LIKE 'collation_%';

表字符集

ALTER TABLE table_name MODIFY column_name column_type CHARACTER SET utf8;

以及Radius认证配置文件中的用户名字段的编码设置
应该是可以支持中文的

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    答案:

    这个问题很可能是由于字符编码不一致引起的。步骤如下:

    1. 在 MySQL 数据库中,将相关的表格的字符集修改为 utf8mb4,如下所示:

    ALTER TABLE radcheck CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

    ALTER TABLE radreply CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

    ALTER TABLE radgroupcheck CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

    ALTER TABLE radgroupreply CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

    1. 修改 MySQL 配置文件(/etc/mysql/my.cnf),确保 MySQL 数据库的默认编码也是 utf8mb4,如下所示:

    [client]

    default-character-set = utf8mb4

    [mysqld]

    character-set-server = utf8mb4

    collation-server = utf8mb4_unicode_ci

    1. 在 freeradius 的配置文件(/usr/local/etc/raddb/sql.conf)中,修改编码方式为 utf8mb4,如下所示:

    driver = "rlm_sql_mysql"

    server = "localhost"

    login = "radius"

    password = "password"

    radius_db = "radius"

    acct_table1 = "radacct"

    acct_table2 = "radacct"

    postauth_table = "radpostauth"

    authcheck_table = "radcheck"

    authreply_table = "radreply"

    groupcheck_table = "radgroupcheck"

    groupreply_table = "radgroupreply"

    usergroup_table = "usergroup"

    simul_count_query = "SELECT COUNT(*) FROM ${acct_table1} WHERE username = '%{%k}' AND nasipaddress = '%{%{Packet-Src-IP-Address}:-%{NAS-IP-Address}}'"

    simul_verify_query = "SELECT radacctid, acctsessionid, username, nasipaddress, nasportid, framedipaddress, acctstarttime, acctstoptime, acctsessiontime, acctauthentic, connectinfo_start, connectinfo_stop FROM ${acct_table1} WHERE username = '%{%k}' AND nasipaddress = '%{%{Packet-Src-IP-Address}:-%{NAS-IP-Address}}' ORDER BY acctstarttime DESC"

    groupmembership_query = "SELECT ${groupreply_table}.attribute, ${groupreply_table}.op, ${groupreply_table}.value, ${groupreply_table}.value FROM ${groupcheck_table} LEFT JOIN ${groupreply_table} ON ${groupcheck_table}.groupname = ${groupreply_table}.groupname WHERE ${groupcheck_table}.username = '%{SQL-User-Name}' ORDER BY ${groupreply_table}.priority"

    $INCLUDE sql/mysql/ippool.conf

    encoding = utf8mb4

    1. 通过以上步骤,我们已经修改了数据库和 freeradius 的编码方式,但仍需要确保 Web 服务的编码方式为 utf-8。可以通过修改 Nginx 的配置文件来实现,如下所示:

    location / {

                proxy_pass http://localhost:8080;
    
                proxy_set_header Host $host;
    
                proxy_set_header X-Real-IP $remote_addr;
    
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    
                charset utf-8;
    

    }

    在以上配置中,charset utf-8 表示将 Web 服务的编码方式设置为 utf-8。

    如果以上步骤仍不能解决问题,建议您检查数据表中的字段类型和长度是否符合要求,以及 MySQL 服务器和 freeradius 服务器之间的网络连接是否正常。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^