Если вы не хотите использовать пароль, вам не нужен 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;
});
Это не дало бы мне функциональность входа Метеор. Кроме того, таким образом публикация не будет иметь доступа к идентификатору пользователя, поэтому, если я хочу сохранить коллекции с сервера клиенту, мне нужно будет сохранить все, что небезопасно. – AMWJ
@AMWJ Для вашего первого пункта «Это не даст мне функции входа в систему Meteor», я не думаю, что вы хотите стандартную функцию входа в систему. Для вашего второго пункта «мне пришлось бы упорствовать все», вы имеете в виду публикацию? Если вы говорите об издании, вы можете публиковать только те поля и данные, которые вы хотите. – Kishor
@AMWJ В принципе, вам нужно добавить форму самостоятельно, и когда пользователь нажимает кнопку входа в систему, вам нужно вызвать метод meteor с помощью 'userId', который будет проверять наличие' пользователя' ** на сервере ** и верните true, если нет пользователя, тогда верните false. – Kishor