下面是我在copy-acct-to-home-server中部署的代码片段。它主要是检查用户名是否有"@“符号...如果是,则从mysql表中提取huntgroup,比较NAS-IP-Address。最后,如果查询的结果不为空,则更新代理到领域。
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 } }
}这段代码并没有像我期望的那样工作。下面是true和false条件下的调试消息片段结果
当从数据库中提取一些值时,代理到领域应该已经分配了适当的值(但它不起作用)
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条件都为真(用户名包含@且SQLQueryResult不为空),它也没有使用从数据库获取的值更新属性proxy-to-realm
If条件似乎为真,即使没有从数据库中提取任何值。这是日志片段。
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奇怪的是,如果(SQLQueryResult != '')在这种情况下应该为假,那么它不会从db第二个if条件中提取任何值。
属性SQLQueryResult已在字典中定义为字符串。
我不确定我在这里错过了什么。这似乎是一个简单的逻辑。请求专家的帮助。
发布于 2019-10-31 07:45:18
这里有几个问题。
首先,部分的右大括号应该始终在新行上。配置解析器不是很好,这可能会让它出错。
其次,您混合了属性引用和扩展语法。
if( %{control:SQLQueryResult} != '') {以上内容无效。老实说,我很惊讶表达式解析器没有抛出错误。这可能是因为%{control:SQLQueryResult}中没有空格,所以它将其视为字符串文字,然后将字符串文字与空字符串进行比较。
您需要将展开括在双引号中
if ("%{control:SQLQueryResult}" != '') {或使用属性引用表单
if (&control:SQLQueryResult != '') {我很确定这就是你的问题所在。
https://stackoverflow.com/questions/56104984
复制相似问题