auth_db

Auth_db Module

1. 概述

该模块包含所有需要访问数据库的身份验证相关功能。该模块需要与auth模块一起使用,不能单独使用,因为它依赖于模块。如果您想使用数据库来存储订阅者用户名和密码等身份验证信息,请选择此模块。如果您想使用 radius 身份验证,请改用 auth_radius。

2. 依赖关系

2.1. Kamailio模块

该模块依赖于以下模块(换句话说,列出的模块必须在此模块之前加载):

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。

image.png

# 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。

参数语法:

该参数的默认值为“ 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这将再次询问用户。

负代码可以解释如下:

参数含义如下:

该函数可以从 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() 的含义相同。

参数含义如下:

该函数可以从 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() 的含义相同。

参数含义如下:

该函数可以从 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 属性。用例可以加载被调用者的凭证属性。

参数含义如下:

可以从 ANY_ROUTE 使用此函数。

例 1.14。is_subscriber 使用情况

if (!is_subscriber("$ru", "subscriber", "3")) {
    # 被叫方不是本地订阅者
    ```
}