【问题标题】:Change user password in strapi在strapi中更改用户密码
【发布时间】:2021-09-20 17:36:39
【问题描述】:

Strapi 有 user-permission 插件,它有一个端点来重置忘记的密码。但我想更改一个已知密码(作为用户),其中不需要发送带有验证令牌的电子邮件。在用户权限插件的 Strapi 文档中,我没有遇到这样的端点。我怎样才能做到这一点?

【问题讨论】:

    标签: strapi


    【解决方案1】:

    在检查了user-permission 插件的代码后,我实现了一个更简单的解决方案,而不是扩展插件。为此,我创建了一个自定义控制器(和路由),如下所示:

    /api/custom/controllers/custom.js

        'use strict';
        const _ = require('lodash');
        const { sanitizeEntity } = require('strapi-utils');
        
        const sanitizeUser = user =>
          sanitizeEntity(user, {
            model: strapi.query('user', 'users-permissions').model,
          });
        
        module.exports = {
          async changePassword(ctx) {
            const userFromContext = ctx.state.user;
        
            if (!userFromContext) {
              return ctx.badRequest(null, [{ messages: [{ id: 'No authorization header was found' }] }]);
            }
        
            const params = _.assign({}, ctx.request.body);
            if (
              params.currentPassword &&
              params.newPassword &&
              params.confirmNewPassword &&
              params.newPassword === params.confirmNewPassword
            ) {
        
              const user = await strapi.plugins['users-permissions'].services.user.fetch({
                id: userFromContext.id,
              }, ['role']);
        
              const validPassword = await strapi.plugins['users-permissions'].services.user.validatePassword(params.currentPassword, user.password);
        
              if (!user) {
                return ctx.badRequest('User does not exist');
              }
        
              if (!validPassword) {
                return ctx.badRequest('Old password does not match.')
              }
        
              let updateData = { password: params.newPassword };
              const data = await strapi.plugins['users-permissions'].services.user.edit({ id: user.id }, updateData);
              return ctx.send(sanitizeUser(data));
            }
        
            return ctx.badRequest('New passwords do not match.');
          }
        };
    

    /api/custom/config/routes.json

        {
          "routes": [
            {
              "method": "POST",
              "path": "/custom/change-password",
              "handler": "custom.changePassword",
              "config": {
                "policies": []
              }
            }
          ]
        }
    

    现在我可以使用以下正文向http://localhost:1337/custom/change-password 发布经过身份验证的请求,以便更改登录用户的密码:

        {
          "currentPassword": "Abcd1234",
          "newPassword": "Abcde12345",
          "confirmNewPassword": "Abcde12345"
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-26
      • 2019-11-05
      • 1970-01-01
      • 2016-10-02
      • 2012-05-03
      • 2017-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多