запретить аутентификацию для пользователей с определенным статусом

Я запустил очень простое приложение с помощью генератора перьев. Я хотел бы, как я могу добавить ловушку к конечной точке аутентификации, чтобы предотвратить вход пользователя в систему, если для его статуса установлено значение «заблокирован».

Я знаю, как создавать хуки в сервисе пользователей, но я думаю, что хотел бы, чтобы этот хук был в сервисе аутентификации, и я не совсем уверен, где это делать.

Спасибо


person Chris Tasker    schedule 11.02.2020    source источник
comment
Вы можете перехватить authentication.create - пользователь является частью hook.result и при желании бросить туда NotAuthenticated.   -  person Joe    schedule 13.02.2020


Ответы (1)


Вы можете сделать это, реализовав собственную стратегию (doc)

Допустим, вы работаете с локальной стратегией (электронная почта + пароль)

Тогда вы можете сделать что-то вроде этого:

const { AuthenticationService, JWTStrategy } = require('@feathersjs/authentication');
const { NotAuthenticated } = require('@feathersjs/errors');
const { LocalStrategy } = require('@feathersjs/authentication-local');

    // Extend the LocalStrategy
    class CustomLocalStrategy extends LocalStrategy {
      async authenticate(authentication, params) {
        let resp;

        // Normal authentication
        try {
          resp = await super.authenticate(authentication, params);
        } catch (e) {
          if (e instanceof NotAuthenticated) {
            throw new NotAuthenticated('Not authenticated', {
              reason: 'invalid'
            });
          }
        }

        // Check if user is blocked, blocked should be a bool in the user model
        if (resp.user.blocked) {
          throw new NotAuthenticated('Not authenticated', {
            reason: 'blocked'
          });
        }

        return resp;
      }
    }

    // Register the strategy
    module.exports = app => {
      const authentication = new AuthenticationService(app);
      authentication.register('local', new CustomLocalStrategy());
      app.use('/authentication', authentication);
    };
person S.Visser    schedule 11.02.2020