我尝试将RBAC授权系统构建到应用程序中。用户,角色和权限存储在数据库中。可以将每个角色分配给每个用户。这就是为什么我有一个user_account
联结表将一个role
和一个user_role
表粘合在一起形成多对多关系的原因。整理后,数据库设置如下所示:
CREATE TABLE user_account (
id uuid NOT NULL DEFAULT uuid_generate_v1mc(),
email character varying(128) NOT NULL,
CONSTRAINT user_account_pkey PRIMARY KEY (id),
CONSTRAINT user_account_email_key UNIQUE (email)
);
CREATE TABLE role (
id uuid NOT NULL DEFAULT uuid_generate_v1mc(),
name character varying(128) NOT NULL,
CONSTRAINT role_pkey PRIMARY KEY (id),
CONSTRAINT role_name_key UNIQUE (name)
);
CREATE TABLE user_role (
user_id uuid NOT NULL,
role_id uuid NOT NULL,
CONSTRAINT user_role_pkey PRIMARY KEY (user_id, role_id),
CONSTRAINT user_role_fkey_user FOREIGN KEY (user_id) REFERENCES user_account (id) ON DELETE CASCADE,
CONSTRAINT user_role_fkey_role FOREIGN KEY (role_id) REFERENCES role (id) ON DELETE CASCADE
);
很明显,我已经设置了匹配的go结构:
type User struct {
ID string `db:"id"`
Email string `db:"email"`
}
type Role struct {
ID string `db:"id"`
Name string `db:"name"`
}
到目前为止,一切都很好。单独将一个或多个行提取到匹配的go结构中不是问题。但是我更希望获取用户及其所有分配的角色。生成的go结构看起来像这样:
type User struct {
ID string `db:"id"`
Email string `db:"email"`
Roles []Role
}
我要问的是:将数据提取到结构中的最佳策略是什么?
User
结构。或
我知道如何处理第一种情况,但要解决第二种情况。我正在使用sqlx
和PostgreSQL。我什至有可能实现?如果是,怎么办?使用哪个db
标签?
我对方法二的幼稚查询看起来像这样,但是显然不能按预期工作:
SELECT user_account.id, user_account.email, role.id, role.name
FROM user_account
LEFT OUTER JOIN user_role
ON user_account.id = user_role.user_id
LEFT OUTER JOIN role
ON user_role.role_id = role.id
有什么建议吗?