如何在FreeRADIUS的sites-available/default中获取Perl模块变量
解决FreeRADIUS中自定义属性读取失败的问题
1. 把属性明确注入请求/回复结构
你的Perl函数不能只返回属性值,得把它加到FreeRADIUS的请求哈希里,不然后续阶段读不到。改下my_custom_function的写法:
sub my_custom_function { my $request = shift; # 直接把属性塞进请求结构 $request->{'CustomAttribute'} = 'your_hardcoded_value'; # 或者用官方推荐的add_attr方法,更规范 # $request->add_attr('CustomAttribute', 'your_hardcoded_value'); return RLM_MODULE_OK; }
记得在authorize块里调用这个函数,确保属性在授权阶段就被注入。
2. 对齐属性设置和条件判断的执行时机
如果CustomAttribute是在post_auth阶段才设置的,那authorize阶段的if条件肯定读不到。要确认:调用函数的步骤,必须在你用%{CustomAttribute}做判断的代码之前。比如条件在authorize块里,函数就得在同一个块的前面执行。
3. 用带前缀的变量引用格式
默认的%{CustomAttribute}会优先找回复属性,如果你是存在请求里的,就会报错。得明确指定前缀:
- 请求属性用
%{request:CustomAttribute} - 回复属性用
%{reply:CustomAttribute}
正确的条件写法示例:
if (%{request:CustomAttribute} == "expected_value") { # 这里写你的逻辑 }
4. 调试确认属性是否真的被注入
在Perl模块里加个日志,看看属性有没有被正确设置:
use Data::Dumper; sub my_custom_function { my $request = shift; $request->{'CustomAttribute'} = 'test_value'; # 把请求结构打日志里,调试用 $RADIUS::log->info("Request after setting attr: " . Dumper($request)); return RLM_MODULE_OK; }
然后用radiusd -X启动调试模式,跑radtest后看日志,确认CustomAttribute在请求结构里。
5. 检查字典定义是否正确
确保你加的字典条目格式没问题,比如:
ATTRIBUTE CustomAttribute 1000 string
属性编号别和现有属性冲突,类型(string/integer)要和你设置的值匹配。
内容的提问来源于stack exchange,提问作者Sundararajan
相关产品推荐
相关产品推荐

