如何以编程方式设置 Strapi 用户角色?

问题描述 投票:0回答:1

我正在使用 Strapi 3.6.10。

当我通过

http://host:1337/auth/local/register
创建用户时,我无法实现所需的用户角色。它总是
Authenticated
,即使我直接在我的请求中将其设置为另一个

{  
    "username": "user",   
    "email": "[email protected]",  
    "password": "123456789",   
    "role": {   
        "_id": "626eacea45f0a420ccb35094"
    }
}

我还尝试使用由文档插件 Swagger -

PUT /users/{id}
生成的 API。但是,如果我发送具有新角色的请求,我的用户条目不会发生任何变化

roles strapi
1个回答
0
投票

我建议您通过 StrAPI 管理面板编辑您的默认注册用户角色,前往

Settings > Advanced Settings

您将能够编辑“经过身份验证的用户的默认角色”。这是新帐户的默认角色。

然后,如果您希望用户能够更改其角色,则必须创建一个自定义路由来处理它。例如,我创建了一条

updateMe
路线来执行此操作。

src/extensions/users-permissions/strapi-server.js
中创建一个文件,您可以在其中编辑用户信息。

// src/extensions/users-permissions/strapi-server.js

module.exports = (plugin) => {
    // Register custom controller
    plugin.controllers.user.updateMe = async (ctx) => {
        // Find role object in the DB by its type (it is like his name but in lowercase, without symbols)
        const roleObject = await strapi
            .query("plugin::users-permissions.role")
            .findOne({
                where: { type: "new_role_name" }, // Here specify the role you want to attribute
            });

        // Update user in the DB by assigning its new role
        await strapi
            .query("plugin::users-permissions.user")
            .update({
                where: { id: ctx.state.user.id },
                data: { role: roleObject.id },
            })
            .then((updatedUser) => {
                return ctx.send(updatedUser);
            })
            .catch((err) => {
                return ctx.badRequest(null, err);
            });
    };

    // Register the route
    plugin.routes["content-api"].routes.push(
    {
        method: "PUT",
        path: "/user/me", // It is important to not use already created routes like "users" to prevent from conflicts problems with StrAPI Core elements
        handler: "user.updateMe",
        config: {
            prefix: "",
            policies: [],
        },
    },
}

重要

您必须允许经过身份验证的用户(或您想要的默认用户角色)访问您的自定义路由。

为此,您必须重新启动 StrAPI 服务器,然后转到

Settings > Roles (users & permissions plugin) > Authenticated (or any default role) > Users Permissions
并检查
updateMe
端点。

现在,如果您在

PUT
上执行
/api/user/me
请求,并使用相应的用户 JWT 传递承载令牌,您的用户将更改其角色。

由你来整合你想要控制的逻辑,但仅此而已!

请毫不犹豫地拆分代码以获得更好的可移植性,这里是如何向用户授予角色的示例,但我已经创建了用于将来处理多个路由和控制器的文件夹,其中包含控制器和路由文件夹。

希望这会有所帮助,我在寻找这个解决方案时经历了很多痛苦。

© www.soinside.com 2019 - 2024. All rights reserved.