我正在使用 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。但是,如果我发送具有新角色的请求,我的用户条目不会发生任何变化
我建议您通过 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 传递承载令牌,您的用户将更改其角色。
由你来整合你想要控制的逻辑,但仅此而已!
请毫不犹豫地拆分代码以获得更好的可移植性,这里是如何向用户授予角色的示例,但我已经创建了用于将来处理多个路由和控制器的文件夹,其中包含控制器和路由文件夹。
希望这会有所帮助,我在寻找这个解决方案时经历了很多痛苦。