Ubuntu 5.15下Apache2/PHP结合FreeRADIUS实现授权方案咨询
问题场景
我有两台服务器:一台Apache2 Web服务器和一台FreeRADIUS服务器,已通过libapache2-mod-auth-radius包实现Web服务器向RADIUS服务器的认证功能,目前认证正常,需要进一步实现授权功能。
我的授权思路是通过简单角色标识符变量控制页面元素,示例代码如下:
// 示例仅说明为何希望通过变量实现授权 //Role1 if(in_array("Role1", $Roles, true)){ ?> <center> <form method="post"> <button... //Role2 if(in_array("Role2", $Roles, true)){ ?> <center> <form method="post"> <button...
遇到的问题
我尝试在FreeRADIUS用户配置中添加Reply-Message属性传递角色信息,但认证成功后该信息未传递到Web服务器:
FreeRADIUS用户配置
admin Cleartext-Password := "Secret" Reply-Message = "Role"
RADIUS本地测试结果(正常)
admin@radiusserver:~$ radtest admin Secret localhost 0 testing123 Sent Access-Request Id 215 from 0.0.0.0:58426 to 127.0.0.1:1812 length 75 User-Name = "admin" User-Password = "Secret" NAS-IP-Address = 127.0.1.1 NAS-Port = 0 Message-Authenticator = 0x00 Cleartext-Password = "Secret" Received Access-Accept Id 215 from 127.0.0.1:1812 to 127.0.0.1:58426 length 31 Reply-Message = "Role"
Web服务器端无法获取该信息
azubi@webserver:~$ cat /var/log/apache2/access.log 172.31.31.2 - admin [15/Mar/2023:18:52:22 +0000] "GET /website/website.php HTTP/1.1" 200 1077 "https://x.x.x.x/" "Mozilla/5.0 (X11; Linux x86_64;rv:109.0) Gecko/20100101 Firefox/109.0" admin@webserver:~$ journalctl | grep role # 无相关输出
寻求无需大规模重构的认证+授权实现方案。
解决方案
1. 使用标准RADIUS Class 属性传递角色
Reply-Message 主要用于返回提示信息,libapache2-mod-auth-radius 默认不会将其传递到Web应用层。而Class是RADIUS标准的授权属性,专门用于传递用户分组/角色信息,模块会处理并转发该属性。
修改FreeRADIUS用户配置(通常在/etc/freeradius/3.0/users):
# 单个角色 admin Cleartext-Password := "Secret" Class = "Role1" # 多个角色(支持添加多条Class属性) admin Cleartext-Password := "Secret" Class = "Role1" Class = "Role2"
2. 配置Apache将RADIUS属性传递给PHP
在Apache的虚拟主机配置文件(如/etc/apache2/sites-available/your-site.conf)或网站根目录的.htaccess中添加以下配置:
# 启用将RADIUS属性作为CGI/环境变量传递 AuthRadiusAddCgiVars On # 确保认证失败时返回401而非403(可选,根据需求调整) AuthRadiusSendForbiddenOnFailure Off
3. 在PHP中获取角色信息
配置完成后,PHP可以通过$_SERVER全局变量获取RADIUS返回的Class属性:
- 如果是单个角色:
$Roles = [$_SERVER['RADIUS_CLASS']];
- 如果是多个角色,mod_auth-radius会将多个
Class属性合并为逗号分隔的字符串:
$Roles = explode(',', $_SERVER['RADIUS_CLASS']);
之后就可以用你原本的逻辑判断角色并控制页面元素了。
4. 验证配置
- 重启FreeRADIUS服务:
sudo systemctl restart freeradius
- 重启Apache服务:
sudo systemctl restart apache2
- 测试登录后,在PHP代码中打印
$_SERVER查看是否存在RADIUS_CLASS变量,确认角色信息已传递。
内容的提问来源于stack exchange,提问作者Alphabeit
相关产品推荐
相关产品推荐

