После создания пользователя в meteor сеанс меняется на нового пользователя

#meteor #meteorite

#метеор #метеорит

Вопрос:

Я создаю свою пользовательскую страницу «Создать пользователя» для meteor, все хорошо, и пользователь сохраняется, но после этого мой фактический сеанс изменяется новым пользователем. т.Е. Мой администратор — «admin», и когда я создаю нового пользователя «foo», сеанс меняется на «foo». Я переопределяю Account.CreateUser для первоначального запуска

Это мой код

 Template.usuarioNew.events
  'submit .form': (e) ->
    e.preventDefault()
    username = $('#username').val()
    name = $('#name').val()
    password = $('#password').val()

    roles = $('.role:checked')

    if roles.length == 0
      FlashMessages.sendWarning 'Escoge al menos un rol'
      return

    user =
      'username': username
      'password': password
      'profile':
        'name': name
      'roles': []

    roles.each (i) ->
      user.roles.push $(@).val()
      return

    Accounts.createUser user
    FlashMessages.sendSuccess 'Se ha creado un usuario'
    Router.go('/')

    return
  

И Accounts.onCreateUser

 Accounts.onCreateUser (options, user) ->
  userProperties =
    profile: options.profile || {}
    roles: options.roles || []

  user = _.extend user, userProperties

  if !user.profile.name
    user.profile.name = user.username

  if !Meteor.users.find().count()
    user.roles.push 'admin', 'boss', 'specialist'

  user
  

Ответ №1:

Это ожидаемое поведение при вызове Accounts.createUser с клиента. Как указано в документации:

На клиенте эта функция входит в систему как вновь созданный пользователь при успешном завершении. На сервере он возвращает вновь созданный идентификатор пользователя.

Единственный способ вставить пользователя без входа в систему как вновь созданного пользователя — это инициировать процесс создания с сервера. Вы можете сделать это с помощью вызова метода. В вашем submit обратном вызове замените вызов на Accounts.createUser user :

 Meteor.call 'insertUser', user
  

Затем на сервере вы можете реализовать метод следующим образом:

 Meteor.methods
  'insertUser': (user) ->
    check user, Match.ObjectIncluding
      username: String
      password: String
      profile: name: String

    Accounts.createUser user
  

Единственная проблема заключается в том, что вы отправляете пароль пользователя на сервер, что разумно только в том случае, если вы используете SSL. И даже тогда это может быть не очень хорошей идеей

Если вы не хотите передавать пароль, как указано в документах, вы можете создать пользователя, используя приведенный выше пример, но вы захотите заменить password на an email , а затем вызвать sendEnrollmentEmail следующим образом:

 Meteor.methods
  'insertUser': (user) ->
    check user, Match.ObjectIncluding
      username: String
      email: String
      profile: name: String

    userId = Accounts.createUser user
    Accounts.sendEnrollmentEmail userId
  

Затем вам нужно будет создать маршрут на клиенте, который при запросе вызывает resetPassword с соответствующим токеном и новым паролем. Выполнение всего этого требует больше работы как для вас, так и для пользователя, но это наиболее безопасная реализация, отвечающая вашим требованиям.