在otrs中获取客户用户的组

Get the groups of a customeruser in otrs

我正在使用应用程序扩展 OTRS,需要获取客户用户所在的组。我想通过与 SessionGet-Endpoint (https://doc.otrs.com/doc/api/otrs/6.0/Perl/Kernel/GenericInterface/Operation/Session/SessionGet.pm.html)

通信来完成此操作

SessionGet 的端点 returns 很多关于用户的信息,但不是他所在的组。我不是在谈论可以登录到 otrs 后端的代理,而是客户用户。

我正在使用 OTRS 6,因为它是 docker 中唯一可用的。我在后端创建了 REST 端点,一切正常。有一个新功能为什么我需要获取有关组的信息。

查看了 otrs 系统配置,但无法确定是否可以在响应中包含此信息。

虽然我是一名程序员,但因为...原因我不想写perl。

我查看了在 /opt/otrs/Kernel/GenericInterface/Operation/Session/SessionGet.pm 处处理传入请求的文件,并跟踪了对从 /opt/otrs/Kernel/System/AuthSession/DB.pm 中的数据库收集信息的实际文件的调用。在第 169 行中写了 SQL-statement 所以我想到我可以扩展它来获取组的信息,因为正如我所说,我不想写 perl...

来自此端点的典型响应如下所示:

{
    "SessionData": [
        {
            "Value": "2",
            "Key": "ChangeBy"
        },
        {
            "Value": "2019-06-26 13:43:18",
            "Key": "ChangeTime"
        },
        {
            "Value": "2",
            "Key": "CreateBy"
        },
        {
            "Value": "2019-06-26 13:43:18",
            "Key": "CreateTime"
        },
        {
            "Value": "XXX",
            "Key": "CustomerCompanyCity"
        },
        {
            "Value": "",
            "Key": "CustomerCompanyComment"
        }
        ...
}

插入另一个带有组 ID 的 Value-Key-pair 是一件好事。 SQL-statement 仅查询一个 table $Self->{SessionTable},主要称为 otrs.sessions

我使用以下资源创建了一个 SQL-statement,它使用所需的信息扩展了现有的 SQL-statement。你可以在这里找到它:

$DBObject->Prepare(
        SQL => "
            (
                SELECT id, data_key, data_value, serialized FROM $Self->{SessionTable} WHERE session_id = ? ORDER BY id ASC
            ) 
            UNION ALL
            (
                SELECT 
                (
                    SELECT MAX(id) FROM $Self->{SessionTable} WHERE session_id = ?
                ) +1 
                AS id,
                'UserGroupsID' AS data_key,
                (
                    SELECT GROUP_CONCAT(DISTINCT group_id SEPARATOR ', ') 
                    FROM otrs.group_customer_user 
                    WHERE user_id = 
                    (
                        SELECT data_value 
                        FROM $Self->{SessionTable} 
                        WHERE session_id = ? 
                        AND data_key = 'UserID' 
                        ORDER BY id ASC
                    )
                )
                AS data_value,
                0 AS serialized
            )",
        Bind => [ $Param{SessionID}, $Param{SessionID}, $Param{SessionID} ],
    );

任何需要获取客户用户组的人都可以用提供的代码替换现有代码。至少在我的情况下它工作得很好。现在,我得到了预期的 key-value-pair:

{
    "Value": "10, 11, 6, 7, 8, 9",
    "Key": "UserGroupsID"
},

我使用了以下资源:

  • Adding the results of multiple SQL selects?
  • Can I concatenate multiple MySQL rows into one field?
  • Add row to query result using select

编码愉快,

妮可