freeradius - 如果语句的评估不一致

标签 freeradius

这是我在 copy-acct-to-home-server 中部署的代码片段。它基本上检查用户名是否有“@”符号...如果是,则它从比较 NAS-IP-地址的 mysql 表中提取 Huntgroup。最后,如果查询结果不为空,则更新代理到领域。

if(request:User-Name =~ /@/){
                            update control {
                                    SQLQueryResult := "%{sql:SELECT `groupname` FROM `radhuntgroup` WHERE nasipaddress='%{NAS-IP-Address}'}" }
                            if( %{control:SQLQueryResult} != '') {
                                    update control {
                                    Proxy-To-Realm := SQLQueryResult } }
                    }

这段代码没有按照我的预期工作。这是正确和错误条件下的调试消息片段结果

当从数据库中提取某些值时,应该为代理领域分配正确的值(但它不起作用)

 Acct-Session-Id = "5CD8CA8B-0012B000"
    Framed-IP-Address = host.ip.address.local
    Acct-Multi-Session-Id = "24c9a18012b85c514f44f9715cd8ca8b085b"
    Acct-Link-Count = 1
    Acct-Status-Type = Start
    Acct-Authentic = RADIUS
    User-Name = "user@domain.com"
    NAS-IP-Address = some.ip.add.NAS
    NAS-Identifier = "CustomNASID"

   .........



    --> user@domain.com
(6)         SQL-User-Name set to 'user@domain.com'
rlm_sql (sql): Reserved connection (5)
(6)         EXPAND /var/log/freeradius/sqllog.sql
(6)            --> /var/log/freeradius/sqllog.sql
(6)         Executing select query: SELECT `groupname` FROM `radhuntgroup` WHERE nasipaddress='some.ip.add.NAS'
rlm_sql (sql): Released connection (5)
(6)         EXPAND %{sql:SELECT `groupname` FROM `radhuntgroup` WHERE nasipaddress='%{NAS-IP-Address}'}
(6)            --> customRealm
(6)         SQLQueryResult := customRealm
(6)       } # update control = noop
(6)       if ( %{control:SQLQueryResult} != '') {
(6)       if ( %{control:SQLQueryResult} != '')  -> TRUE
(6)       if ( %{control:SQLQueryResult} != '')  {
(6)         update control {
(6)           No attributes updated
(6)         } # update control = noop
(6)       } # if ( %{control:SQLQueryResult} != '')  = noop
(6)     } # if (request:User-Name =~ /@/) = noop
(6)   } # preacct = ok

从日志中可以看出,即使两个 if 条件都为 true(用户名包含 @ 并且 SQLQueryResult 不为空),它也不会使用从数据库获取的值更新属性 proxy-to-realm

即使没有从数据库获取任何值,If 条件似乎也为 true。这是日志片段。

 Acct-Session-Id = "5CD8C9F7-C1DA2D04"
    Framed-IP-Address = host.ip.address.local
    Acct-Multi-Session-Id = "441e98b16388185680b4a7355cd8c9f7000a"
    Acct-Link-Count = 5
    Acct-Status-Type = Interim-Update
    Acct-Authentic = RADIUS
    User-Name = "user@somedomain"
    NAS-IP-Address = some.ip.address.nas


   ...........



    Executing section preacct from file /etc/freeradius/3.0/sites-enabled/copy-acct-to-home-server
(8)   preacct {
(8)     [preprocess] = ok
(8)     if (request:User-Name =~ /@/){
(8)     if (request:User-Name =~ /@/) -> TRUE
(8)     if (request:User-Name =~ /@/) {
(8)       update control {
(8)         EXPAND %{User-Name}
(8)            --> user@domain.com
(8)         SQL-User-Name set to 'user@domain.com'
rlm_sql (sql): Reserved connection (6)
(8)         EXPAND /var/log/freeradius/sqllog.sql
(8)            --> /var/log/freeradius/sqllog.sql
(8)         Executing select query: SELECT `groupname` FROM `radhuntgroup` WHERE nasipaddress='nas.ip.address.local'
(8)         SQL query returned no results
rlm_sql (sql): Released connection (6)
(8)         EXPAND %{sql:SELECT `groupname` FROM `radhuntgroup` WHERE nasipaddress='%{NAS-IP-Address}'}
(8)            --> 
(8)         SQLQueryResult := 
(8)       } # update control = noop
(8)       if ( %{control:SQLQueryResult} != '') {
(8)       if ( %{control:SQLQueryResult} != '')  -> TRUE
(8)       if ( %{control:SQLQueryResult} != '')  {
(8)         update control {
(8)           No attributes updated
(8)         } # update control = noop
(8)       } # if ( %{control:SQLQueryResult} != '')  = noop
(8)     } # if (request:User-Name =~ /@/) = noop
(8)   } # preacct = ok

奇怪的是,虽然它没有从数据库中获取任何值 第二个 if 条件被评估为 true if (SQLQueryResult != '') 在这种情况下应该为 false。

属性 SQLQueryResult 已在字典中定义为字符串。

我不确定我在这里缺少什么......似乎是简单的逻辑。请求专家帮助。

最佳答案

这里有几个问题。

首先,各节的右大括号应始终换行。配置解析器不太好,这可能会出错。

其次,您要混合属性引用和扩展语法。

if( %{control:SQLQueryResult} != '') {

以上内容无效。老实说,我很惊讶表达式解析器没有抛出错误。这可能是因为 %{control:SQLQueryResult} 中没有空格,因此它将其视为字符串文字,然后将字符串文字与空字符串进行比较。

您需要将扩展​​括在双引号中

if ("%{control:SQLQueryResult}" != '') {

或使用属性引用表

if (&control:SQLQueryResult != '') {

我相当确定这就是导致您出现问题的原因。

关于freeradius - 如果语句的评估不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56104984/

相关文章:

mysql - 如何在单个 mysql 命令中删除此选择查询的结果?

apache - 使用 freeRadius 和 Apache 进行单点登录?

ubuntu - CoovaChilli 身份验证

ubuntu - 更新 Ubuntu 16.04 后,Freeradius 不起作用

我可以使用 libfreeradius 制作自己的 Radius 服务器吗?

ssl - 在 EAP-TTLS Freeradius 中使用证书时出现错误 "handshake failure"

mysql - 剪切/优化 radacct 表 (FreeRADIUS)

mysql - 将两个身份验证类型 PAP 和 EAP 与 FreeRadius 结合使用

mysql - Freeradius 与 NAS 显示的在线用户数不正确

c - FreeRadius字典加载