在 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认证配置文件中的用户名字段的编码设置
应该是可以支持中文的
答案:
这个问题很可能是由于字符编码不一致引起的。步骤如下:
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;
[client]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
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
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 服务器之间的网络连接是否正常。