You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 验证配置

  1. 重启FreeRADIUS服务:
sudo systemctl restart freeradius
  1. 重启Apache服务:
sudo systemctl restart apache2
  1. 测试登录后,在PHP代码中打印$_SERVER查看是否存在RADIUS_CLASS变量,确认角色信息已传递。

内容的提问来源于stack exchange,提问作者Alphabeit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 11:13:37