首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Apache guacamole使用postgres创建用户

Apache guacamole使用postgres创建用户
EN

Stack Overflow用户
提问于 2020-01-22 14:34:10
回答 3查看 2.1K关注 0票数 0

我使用最新的docker和postgres 12作为数据库,我想使用postgres创建一个登录用户,但它不能工作。

这是如何从文档中创建用户:

代码语言:javascript
复制
-- Generate salt
SET @salt = UNHEX(SHA2(UUID(), 256));

-- Create user and hash password with salt
INSERT INTO guacamole_user (username, password_salt, password_hash)
     VALUES ('myuser', @salt, UNHEX(SHA2(CONCAT('mypassword', HEX(@salt)), 256)));

但是在这里,第一个命令给出了一个错误:

代码语言:javascript
复制
guacamole_db=# SET @salt = UNHEX(SHA2(UUID(), 256));
ERROR:  syntax error at or near "@"
LINE 1: SET @salt = UNHEX(SHA2(UUID(), 256));
            ^

从docs中可以看到,他们如何在postgres中创建了一个优秀用户:"guacadmin“

代码语言:javascript
复制
INSERT INTO guacamole_entity (name, type) VALUES ('guacadmin', 'USER');
INSERT INTO guacamole_user (entity_id, password_hash, password_salt, password_date)
SELECT
    entity_id,
    decode('CA458A7D494E3BE824F5E1E175A1556C0F8EEF2C2D7DF3633BEC4A29C4411960', 'hex'),  -- 'guacadmin'
    decode('FE24ADC5E11E2B25288D1704ABE67A79E342ECC26064CE69C5B3177795A82264', 'hex'),
    CURRENT_TIMESTAMP
FROM guacamole_entity WHERE name = 'guacadmin' AND guacamole_entity.type = 'USER';

-- Grant admin permission to read/update/administer self
INSERT INTO guacamole_user_permission (entity_id, affected_user_id, permission)
SELECT guacamole_entity.entity_id, guacamole_user.user_id, permission::guacamole_object_permission_type
FROM (
    VALUES
        ('guacadmin', 'guacadmin', 'READ'),
        ('guacadmin', 'guacadmin', 'UPDATE'),
        ('guacadmin', 'guacadmin', 'ADMINISTER')
) permissions (username, affected_username, permission)
JOIN guacamole_entity          ON permissions.username = guacamole_entity.name AND guacamole_entity.type = 'USER'
JOIN guacamole_entity affected ON permissions.affected_username = affected.name AND guacamole_entity.type = 'USER'
JOIN guacamole_user            ON guacamole_user.entity_id = affected.entity_id;

我如何翻译这个来创建新的用户,“测试”与密码"123456“,并只读预?

相关表如下所示:

guacamole_entity :

代码语言:javascript
复制
 entity_id |   name    | type
-----------+-----------+------
         1 | guacadmin | USER

guacamole_user:

代码语言:javascript
复制
 user_id | entity_id |                           password_hash                            |                           password_salt                            |        pass
word_date         | disabled | expired | access_window_start | access_window_end | valid_from | valid_until | timezone | full_name | email_address | organization | organiza
tional_role
---------+-----------+--------------------------------------------------------------------+--------------------------------------------------------------------+------------
------------------+----------+---------+---------------------+-------------------+------------+-------------+----------+-----------+---------------+--------------+---------
------------
       1 |         1 | \xca458a7d494e3be824f5e1e175a1556c0f8eef2c2d7df3633bec4a29c4411960 | \xfe24adc5e11e2b25288d1704abe67a79e342ecc26064ce69c5b3177795a82264 | 2020-01-13
09:10:56.73947+00 | f        | f       |                     |                   |            |             |          |           |               |              |

guacamole_user_permission :

代码语言:javascript
复制
 entity_id | affected_user_id | permission
-----------+------------------+------------
         1 |                1 | READ
         1 |                1 | UPDATE
         1 |                1 | ADMINISTER
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-02-20 09:22:28

最后,我使用python中的POST请求创建了一个用户:第一部分是,我们需要为我们要发送到guacamole的所有请求获取一个令牌:

导入请求

代码语言:javascript
复制
url = "http://guacamoleipornginx/api"
headers ={
    'Accept': 'application/json',
    'Content-Type': 'application/x-www-form-urlencoded'}
res = requests.post(url + "/tokens", headers=headers, data={'username': 'guacadmin', 'password': 'guacadmin'})
authToken = res.json()['authToken']

有了这个标记,我们可以发送一个创建用户的请求:用您的值填充用户名。

代码语言:javascript
复制
headers ={
        'Accept': 'application/json',
        'Content-Type': 'application/json;charset=UTF-8'}

uri = "session/data/postgresql/users?token=" + authToken
data = {
        "username": $USERNAME,
        "password": $USERPASSWORD,
        "attributes":{"disabled":"","expired":"","access-window-start":"","access-window-end":"","valid-from":"","valid-until":"","timezone":None}}
res = requests.post(url + "/" + uri, headers=headers, json=data)

这里的最后一部分是给上面创建的用户一个查看连接的权限,如果你不需要的话,你不需要使用它。对于此请求,我们将需要您创建的连接的连接id。我的鳄梨酱是我在这里买的码头鳄梨酱:https://github.com/boschkundendienst/guacamole-docker-compose

它使用nginx + gouacamole和postgreSql,所以在postgrs中,您可以看到guacamole_connection下的连接id。然后,可以将连接前置添加到创建的用户:

代码语言:javascript
复制
uri = "session/data/postgresql/users/" + $USERNAME+ "/permissions?token=" + authToken
ID = 52 # here is the connection id of some connection created in guoacamole psql db.
data = [
            {"op":"add",
            "path": '/connectionPermissions/' + str(ID),
            "value":"READ"}]
res = requests.patch(url + "/" + uri, headers=headers, json=data)

您也可以使用此方法向guacamole添加连接。您只需打开F12并查看它在创建连接并使用上面相同的方法时发送的值。

我还添加了另一个很酷的东西--这就是如何看到活动连接的方法:

代码语言:javascript
复制
url = "http://guacamoleipornginx/api"
uri = "/session/data/postgresql/activeConnections?token=" + authToken
res = requests.get(url + "/" + uri)

我希望这能帮助我获得所有这些信息。

票数 1
EN

Stack Overflow用户

发布于 2020-01-26 19:07:07

您所指的示例是为MySql创建的。生成密码的函数使用MySql特定的函数,因此您必须在PostgreSQL中找到合适的替换。

快速搜索发现了以下可能的替代品:

UNHEX - MySQL's HEX() and UNHEX() equivalent in Postgres?

SHA2 -可能是来自pgcrypto模块,https://www.postgresql.org/docs/8.3/pgcrypto.html的一些函数

UUID -可能是uuid_generate_v1()或uuid_generate_v4()

票数 0
EN

Stack Overflow用户

发布于 2020-08-26 16:28:57

正如minokolic所提到的,您所指的示例是为MySql制作的,并且不需要像MySql那样做。下面是我为在PostgreSQL中创建一个新用户所做的工作:

代码语言:javascript
复制
CREATE_USER = (
    "INSERT INTO guacamole_user "
    "(entity_id, password_hash, password_date) "
    "VALUES (%(entity_id)s, decode(%(pwd)s, 'hex'), CURRENT_TIMESTAMP)"
)

使用那个TSQL查询,注意我们使用了decode函数,我们也删除了salt,如果您想要使用salt,您也应该在该列中使用decode

然后,散列您的用户密码:

代码语言:javascript
复制
hashed_pwd = hashlib.sha256(
    user_password.encode('utf-8')
).hexdigest()

备注:如果要使用salt,则应在散列之前将其连接到密码。

然后,只需执行游标,以创建用户:

代码语言:javascript
复制
cursor.execute(
    CREATE_USER, {'entity_id': entity_id, 'pwd': hashed_pwd},
)

这应该就够了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59862016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档