2016-03-17 2 views
1

Я хотел бы создать учетную систему в Meteor, чтобы пользователи не могли создавать свои собственные учетные записи и не иметь паролей. По сути, пользователь сможет войти в систему, получив имя учетной записи пользователя (в моем случае - целую цепочку). Я попытался использовать модуль account-pasword и изменил его, но мне не кажется очевидным, как я это сделаю.Метеоритные счета без паролей

На данный момент, у меня есть метод метеоритный createPlayer:

createPlayer: function() { 
    var id = Math.floor(Math.random() * 10000000).toString(); 
    Accounts.createUser({ username: id, password: "test" }); 
    return id; 
} 

, и я называю это когда сервер перезагружается:

for (var i = 0; i < numberOfUsers; i++) { 
     Meteor.call("createPlayer"); 
    } 

Недостатком здесь (1) есть еще пароль поле, в которое пользователь должен ввести пароль «test» по умолчанию, и (2) есть еще одна кнопка для пользователя, чтобы создать новую учетную запись, отличную от тех, которые я уже создал.

Редактировать: Решение должно позволить мне публиковать только те данные, которые относятся к зарегистрированному пользователю. Например, с помощью учетной записи-пароли можно использовать this.userId в опубликовывать, чтобы всегда иметь последнюю дату список задач:

Meteor.publish("tasks", function() { 
     var user = Meteor.users.findOne(this.userId); 
     if (user && user.admin) { 
      return Tasks.find({}); 
     } 
     return Tasks.find({ user: this.userId }); 
    }); 

Любая помощь приветствуется.

ответ

0

Если вы не хотите использовать пароль, вам не нужен accounts-password или любой пакет, просто создайте коллекцию и вставьте пользователей в эту коллекцию. Если вы используете simple-schema, то вы можете определить схему для вашей коллекции

Users = new Mongo.Collection('userInfo'); //I am using userInfo because, users is used by accounts package 

Users_Schema = new SimpleSchema({ 
    username: { 
     type: String, 
     optional: false 
    }, 
    firstName: { 
     type: String, 
     optional: false 
    }, 
    lastName: { 
     type: String, 
     optional: false 
    }, 
    age: { 
     type: Number, 
     optional: false 
    }, 
    //.. other details that you need. 
}); 

Users.attachSchema(Users_Schema); 

Тогда вместо Accounts.createUser, вы можете вставить новый пользователь, вы можете проверить, если username уже существует, и выдаст ошибку соответствующим образом.

Users.insert({ 
    username: "someUniqueUsername", 
    firstName: "userFirstName", 
    lastName: "userLastName", 
    age: 20 
}); 

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

Users.deny({ 
    insert: function() { 
     return true; 
    }, 
    update: function() { 
     return true; 
    }, 
    remove: function() { 
     return true; 
    } 
}); 

Update

Насколько я знаю, вы не можете достичь логин без пароля с помощью accounts пакета. Чтобы уточнить ваш второй пункт в комментарии, см. Следующее.

Для входа в виде HTML, создать поле ввода для имени пользователя и кнопка входа в систему,

<template name="loginForm"> 
    <label for="username">Username:</label> 
    <input id="username" type="text" /><br/> 
    <input id="btnLogin" type="button" value="Login" /> 
</template> 

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

Template.loginForm.events({ 
    'click #btnLogin': function (ev, template) { 
     var userId = template.$('#username').val(); 
     //validate if userId is non-empty and valid userId before calling meteor method. 
     Meteor.call('loginUser', userId, function (err, result) { 
      if (err) { 
       Session.set('userId', null); 
       alert("There is an error while logging in."); 
      } else { 
       if (result === true) { 
        Session.set('userId', userId); 
        Router.go('someRouteAfterLogin'); //redirect to a different page. 
       } else { 
        Session.set('userId', null); 
        alert("There is no such user."); 
       } 
      } 
     }); 
    } 
}); 

В какой-то другой шаблон, где user уже вошли в систему, получить

Template.someTemplateAfterLogin.onCreated(function() { 
    //Actually, this can go inside your Router's current route's data and waitOn but for demonstration purpose 
    var userId = Session.get("userId"); 
    if (userId) { 
     this.subscribe('userInfo', userId); 
    } else { 
     Router.go('login'); //or whatever name you specified for login 
    } 
}); 

На стороне сервера,

Meteor.methods({ 
    'loginUser': function (userId) { 
     if (typeof userId == "string") { 
      var user = Users.findOne({ username: userId }); 
      return user ? true : false; 
     } 
     return false; 
    } 
}); 

Meteor.publish('userInfo', function (userId) { 
    if (typeof userId == "string") { 
     return Users.find({ username: userId }); //use second parameter to restrict the fields that you want to publish with something like this return Users.find({ username: userId }, { fields: { username: 1, firstName: 1 } }); 
    } 
    return null; 
}); 
+0

Это не дало бы мне функциональность входа Метеор. Кроме того, таким образом публикация не будет иметь доступа к идентификатору пользователя, поэтому, если я хочу сохранить коллекции с сервера клиенту, мне нужно будет сохранить все, что небезопасно. – AMWJ

+0

@AMWJ Для вашего первого пункта «Это не даст мне функции входа в систему Meteor», я не думаю, что вы хотите стандартную функцию входа в систему. Для вашего второго пункта «мне пришлось бы упорствовать все», вы имеете в виду публикацию? Если вы говорите об издании, вы можете публиковать только те поля и данные, которые вы хотите. – Kishor

+0

@AMWJ В принципе, вам нужно добавить форму самостоятельно, и когда пользователь нажимает кнопку входа в систему, вам нужно вызвать метод meteor с помощью 'userId', который будет проверять наличие' пользователя' ** на сервере ** и верните true, если нет пользователя, тогда верните false. – Kishor

Смежные вопросы