auth_db
1. 概述
该模块包含所有需要访问数据库的身份验证相关功能。该模块需要与auth模块一起使用,不能单独使用,因为它依赖于模块。如果您想使用数据库来存储订阅者用户名和密码等身份验证信息,请选择此模块。如果您想使用 radius 身份验证,请改用 auth_radius。
2. 依赖关系
2.1. Kamailio模块
该模块依赖于以下模块(换句话说,列出的模块必须在此模块之前加载):
- _auth——_通用认证函数
- 数据库——任何数据库模块(目前是 mysql、postgres、dbtext)
2.2. 外部库或应用程序
在加载此模块运行 Kamailio 之前,必须安装以下库或应用程序:
- 没有任何
三、参数
3.1. db_url(string)
这是要使用的数据库的 URL。该参数的值取决于所使用的数据库模块。例如,对于 mysql 和 postgres 模块,类似于 mysql://username:password@host:port/database。对于 dbtext 模块(将数据存储在纯文本文件中),它是数据库所在的目录。
默认值为“ mysql://kamailioro:kamailioro@localhost/kamailio ”。
例 1.1。 db_url参数使用
modparam("auth_db", "db_url", "dbdriver://用户名:密码@dbhost/dbname")
3.2. user_column(string)
这是保存用户名的列的名称。默认值对大多数人来说都很好。如果确实需要更改该参数,请使用该参数。
默认值为“username”。
例 1.2。 user_column参数使用
modparam(“auth_db”,“user_column”,“user”)
3.3. domain_column(string)
这是保存用户域的列的名称。默认值对大多数人来说都很好。如果确实需要更改该参数,请使用该参数。
默认值为“domain”。
例 1.3。 domain_column参数使用
modparam(“auth_db”,“domain_column”,“domain”)
3.4. password_column(string)
这是保存密码的列的名称。密码可以存储为纯文本或预先计算的 HA1 字符串。HA1 字符串是用户名、密码和领域的 MD5 哈希值。HA1 字符串更安全,因为服务器不需要知道明文密码,也无法从 HA1 字符串中获取明文密码。
默认值为“ ha1 ”。
`ha1是通过md5(username:domain:password)计算出来的'
例 1.4。 password_column参数使用
modparam("auth_db", "password_column", "password")
3.5. password_column_2(string)
如上一节所述,此参数包含包含预先计算的 HA1 字符串的列的名称,该字符串的计算结果包括用户名中的域。calculate_ha1仅当设置为 0 并且用户代理发送包含用户名中的域的凭据 时,才使用此参数 。
该参数的默认值为 ha1b。
ha1b是通过md5('username@domain:domain:password')计算出来的
例 1.5。 password_column_2参数使用
modparam(“auth_db”,“password_column_2”,“ha1_2”)
3.6. calculate_ha1(整数)
该参数告诉服务器是否应该使用预先计算的HA1字符串或明文密码进行身份验证。
如果该参数设置为 0 并且凭据的用户名参数还包含“ @domain ”,则服务器将使用 “ password_column_2 ”参数中指定的列中的 HA1 值。 如果 username 参数不包含域,服务器将使用“ password_column ”参数中给出的列中的 HA1 值。
如果该参数设置为 1,则 HA1 值将从“ password_column ” 参数中指定的列计算。
“ password_column_2 ” 列也包含HA1字符串,但它们的计算应包括用户名参数中的域
ha1b是通过md5('username@domain:domain:password')计算出来的,
password_column(当包含HA1字符串时)应始终包含在用户名中不包含域的情况下计算的HA1字符串。 `ha1是通过md5(username:domain:password)计算出来的'
这可确保在使用预先计算的 HA1 字符串时身份验证始终有效,而不取决于用户名中是否存在域。
该参数的默认值为0。

# calculate_ha1=0 时,使用表里面预先计算的HA1, 存储该HA1字段名是ha1
modparam("auth_db", "calculate_ha1", 0)
modparam("auth_db", "password_column", "ha1")
# calculate_ha1=1 时,在运行时计算HA1, 使用表里的密码字段名是password
modparam("auth_db", "calculate_ha1", 1)
modparam("auth_db", "password_column", "password")
例 1.6。 calculate_ha1参数使用
modparam("auth_db", "calculate_ha1", 1)
3.7. use_domain(整数)
如果为 true(非 0),则在订阅者表中查找时也将使用域。如果您有多域设置,强烈建议打开此参数以避免域之间的用户名重叠。
重要提示:在打开此参数之前,请确保 表domain中的列subscriber 已正确填充。
默认值为“ 0(假) ”。
例 1.7。 use_domain参数使用
modparam("auth_db", "use_domain", 1)
3.8. load_credentials(string)
此参数指定执行身份验证时要从数据库获取的凭据。加载的凭据将存储在 AVP 中。如果没有特别给出 AVP 名称,则会使用与列名同名的 NAME AVP。
参数语法:
-
load_credentials = credential (’;’ credential)*
-
credential = (avp_specification ‘=’ column_name) | (column_name)
-
avp_specification = ‘$avp(’ + ‘i:‘ID | ’s:‘NAME | alias + ‘)’
该参数的默认值为“ NULL ”(未加载凭据)。
例 1.8。 load_credentials参数使用
# 将 rpid 列加载到 $avp(i:123) 和 email_address 列中
# 进入 $avp(s:email_address)
modparam("auth_db", "load_credentials", "$avp(i:123)=rpid;email_address")
3.9. version_table(整数)
如果设置为 0,模块将跳过检查订阅者表的版本。
默认值为“ 1(检查表版本) ”。
例 1.9。 version_table参数使用
modparam("auth_db", "version_table", 0)
3.10. force_generate_avps(整数)
如果设置为非 0,即使身份验证失败,模块也会获取用户数据库属性。
默认值为“ 0 ”(如果身份验证失败,则不获取用户数据库属性)。
例 1.10。 force_generate_avps参数使用
modparam("auth_db", "force_generate_avps", 1)
4. 功能
4.1. www_authenticate(realm, table [, method])
名称别名: www_authorize(realm, table)
该函数根据 RFC2617验证凭据。如果凭证验证成功,则该函数将成功并将凭证标记为已授权(标记的凭证稍后可以由其他一些函数使用)。如果该函数由于某种原因无法验证凭据,那么它将失败,并且应该调用脚本,www_challenge这将再次询问用户。
负代码可以解释如下:
- -1(一般错误) - 凭据错误,无法解析凭据,没有剩余内存,无法从表中获取,无法获取领域或发生一些一般错误并且没有发送回复;
- -2(无效密码) ——密码错误;
- -3(无效用户) - 验证用户不存在。
- -4(随机数已过期) - 随机数已过期
- -5(无凭据) - 请求不包含具有正确领域的授权标头。
- -6(随机数重用) -随机数已用于验证先前的请求
- -8(authuser 不匹配) - 根据方法,From/To/RURI 用户与身份验证用户不匹配(请参阅 auth_check() 函数)。
参数含义如下:
-
领域- 领域是一个不透明的字符串,用户代理应将其呈现给用户,以便他可以决定使用什么用户名和密码。通常这是运行服务器的主机的域。
不能为空字符串“”。在 REGISTER 请求的情况下,可以使用 To 标头字段域(例如,变量 $td)(因为该标头字段代表正在注册的用户),对于所有其他消息,可以使用 From 标头字段域(例如,变量 $fd)。
该字符串可能包含伪变量。
-
table - 用于查找用户名和密码的表(通常是subscriber表)。
-
method - 用于身份验证的方法。此参数是可选的,如果未设置,则为请求行上的第一个“单词”。
该函数可以从 REQUEST_ROUTE 中使用。
例 1.11。 www_authorize用法
if (!www_authorize("kamailio.org", "subscriber")) {
www_challenge("kamailio.org", "1");
};
4.2. www_authorize(realm, table)
它与 www_authenticate(realm, table) 的功能相同。保留此名称是为了向后兼容,因为它第一次以这种方式命名是因为它实际上进行了用户身份验证。
4.3. proxy_authenticate(realm, table)
名称别名: proxy_authorize(realm, table)
该函数根据 RFC2617验证凭据。如果凭证验证成功,则该函数将成功并将凭证标记为已授权(标记的凭证稍后可以由其他一些函数使用)。如果该函数由于某种原因无法验证凭据,那么它将失败,并且应该调用脚本, proxy_challenge这将再次询问用户。
负返回码与 www_authenticate() 的含义相同。
参数含义如下:
-
领域- 领域是一个不透明的字符串,用户代理应将其呈现给用户,以便他可以决定使用什么用户名和密码。通常这是运行服务器的主机的域。
不能为空字符串“”。除了静态字符串之外,典型值是From 标头字段域(例如,变量$fd)。
如果是空字符串“使用“”后,服务器将根据请求生成它。来自标头字段的域将用作领域。
该字符串可能包含伪变量。
-
table - 用于查找用户名和密码的表(通常是subscriber表)。
该函数可以从 REQUEST_ROUTE 中使用。
例 1.12。proxy_authorize 使用
if (!proxy_authorize("$fd", "subscriber")) {
proxy_challenge("$fd", "1"); # Realm 将自动生成
};
4.4. proxy_authorize(realm, table)
它与 proxy_authenticate(realm, table) 的功能相同。保留此名称是为了向后兼容,因为它是第一次以这种方式命名,但它实际上进行了用户身份验证。
4.5. auth_check(realm, table, flags)
该功能结合了 www_authenticate 和 proxy_authenticate 的功能,如果 SIP 请求是 REGISTER,则执行第一个功能,其余的执行第二个功能。
此外,关于_flags_参数值,该函数检查身份验证用户名是否与 From/To 标头用户名匹配,以及 PUBLISH 情况下的 Request-URI。
负返回码与 www_authenticate() 的含义相同。
参数含义如下:
-
领域- 领域是一个不透明的字符串,用户代理应将其呈现给用户,以便他可以决定使用什么用户名和密码。通常这是运行服务器的主机的域。 不能为空字符串“”。除了静态字符串之外,典型值是From 标头字段域(例如,变量$fd)。 该字符串可能包含伪变量。
-
table - 用于查找用户名和密码的表(通常是subscriber表)。
该字符串可能包含伪变量。
-
flags - 用于控制函数行为的标志集。如果为 1,则该函数将检查身份验证用户名是否与 To 或 From 标头用户名匹配。REGISTER 请求:From 和 To 必须与身份验证用户匹配。PUBLISH 请求:From、To 和 Request-URI 必须与身份验证用户匹配。所有其他请求:From 标头必须与身份验证用户匹配。
如果位 2 也被设置(flags=3),则跳过 INVITE、BYE、PRACK、UPDATE、MESSAGE 的 ID 检查 - 这些请求可以带有匿名呼叫者 ID。如果设置为 0,则跳过所有用户检查。
此外,将检查已检查 URI 中的所有域和身份验证标头中的领域,以匹配提供的领域参数。
该字符串可能包含伪变量。
该函数可以从 REQUEST_ROUTE 中使用。
例 1.13。auth_check 用法
if (!auth_check("$fd", "subscriber", "1")) {
auth_challenge("$fd", "1");
exit;
}
4.6. is_subscriber(uri, dbtable, flags)
该函数检查 uri 参数中是否存在与 AoR 对应的订阅者。它使用与身份验证功能相同的数据库连接。
此外,如果找到订阅者记录,则加载 load_credentials 属性。用例可以加载被调用者的凭证属性。
参数含义如下:
-
uri - 用于识别订阅者的有效 SIP URI 值。该字符串可能包含伪变量。
-
dbtable - 用于从 URI 查找用户名和域的表(通常是订户表)。该字符串可能包含伪变量。
-
flags - 用于控制函数行为的标志集。如果设置了第 1 位,则该函数将使用 URI 的域部分来执行数据库表搜索。如果设置了第二位,则凭据不会加载到变量中(简单检查订阅者是否存在)。
该参数可以是伪变量。
可以从 ANY_ROUTE 使用此函数。
例 1.14。is_subscriber 使用情况
if (!is_subscriber("$ru", "subscriber", "3")) {
# 被叫方不是本地订阅者
```
}