meteor:在服务器端使用account-password创建用户

时间:2014-12-28 03:51:02

标签: meteor

我正在使用meteor accounts-password创建用户注册网页。我不希望用户在注册后立即登录,因此我将请求从客户端发送到服务器,服务器调用Accounts.createUser({username: someusername, password: somepassword})。注册页面的目的是有一个管理员用户注册其他用户。某些用户具有特殊权限,允许他们以后登录。

我的问题是,当客户端向服务器发送请求时,例如,

var userParams = {username: someusername, password: somepassword}
Meteor.call("addUser", userParams)

我是否通过线路将密码从客户端发送到服务器?对不起,如果这听起来像一个愚蠢的问题。但是,我使用wireshark查看了客户端和服务器之间的流量,我没有注意到纯文本密码在IP数据包中。

我想使用帐户密码的功能,因为我希望具有特殊权限的注册用户稍后登录和注销。

所以,我想知道有人可以就这个问题说清楚吗?有没有其他人之前做过这样的事情(即从客户端请求注册服务器端的用户)?我想听听你的建议。

3 个答案:

答案 0 :(得分:1)

如果您已拥有用户且想要创建花药用户,请使用" admin"帐户我建议您使用此包alanning/meteor-roles

并使用此代码

projectName / server / server.js 上的

使用此方法

Meteor.methods({
 createUsers: function(email,password,roles,name){
   var users = [{name:name,email:email,roles:[roles]},
               ];
.each(users, function (user) {
 var id;
id = Accounts.createUser({
 email: user.email,
 password: password,
 profile: { name: user.name }
 });
if (user.roles.length > 0) {
      Roles.addUsersToRoles(id, user.roles);
     }
    });
},
   deleteUser : function(id){       ///Some Delete Method (ignore if dont needed)
  return Meteor.users.remove(id);
  },
});

projectName / server / publish.js 等其他文件上的 file.js 上发布角色

//publish roles
  Meteor.publish(null, function (){ 
   return Meteor.roles.find({})
   })
Meteor.publish("Super-Admin", function () {
    var user = Meteor.users.findOne({_id:this.userId});

     if (Roles.userIsInRole(user, ["Super-Admin"])) {
    return Meteor.users.find({}, {fields: {emails: 1, profile: 1, roles: 1}});
     } 
  this.stop();
      return;
   });

      Meteor.publish("Admin", function () {
   var user = Meteor.users.findOne({_id:this.userId});

    if (Roles.userIsInRole(user, ["Admin"])) {
    return Meteor.users.find({}, {fields: {emails: 1, profile: 1, roles: 1}});
   } 
  this.stop();
 return;
  });
  Meteor.publish(null, function (){ 
 return Meteor.roles.find({})
 })

现在在 projectName / client / register / register.html 上使用此模板

<template name="register">
  <form id="register-form" action="action" >
    <input type="email" id="register-email" placeholder="Nombre Nuevo Usuario">
    <input type="password" id="register-password" placeholder="Password">        
      <select id="register-rol" class="form-control">
         <option value="Admin" selected>Admin</option>
        <option value="Super-Admin" selected>Super Admin</option>
        <option value="Normal" selected>Normal</option>
     </select>
   <input type="submit" value="Register">
  </form>
<!-- List and button with delete -->
{{#each users}}
      <li id="user"><h6>{{email}}</h6><h6>{{roles}}</h6></li>
        <button id="deleteUser" class="btn btn-danger btn-xs" > Borrar Usuario        {{email}}       </button>
     {{/each}}
</tempalate>

并在 projectName / client / register / register.js

 Template.registrar.events({
 'submit #register-form' : function(e, t) {
e.preventDefault();    
 var email = t.find('#register-email').value,
 password = t.find('#register-password').value,
  roles = $( "#register-rol" ).val();
Meteor.call("createUsers", email, password,roles);
 return false;
  },
'click #deleteUser' : function(event,template){
 var idUsuario= this._id;
 Meteor.call('deleteUser',{_id:idUsuario})
 }
});


//Helper for the {{each}} on the .html
Template.registrar.helpers({
     users: function () {
     return Meteor.users.find();
   },
    email: function () {
    return this.emails[0].address;
    },
   roles: function () {
   if (!this.roles) return '<none>';
return this.roles.join(',');
  }
  });

最后在 Subscription.js 订阅角色

Meteor.subscribe('Admin');
Meteor.subscribe('Super-Admin');

现在使用此代码,您可以使用这样的帮助

 {{#if isInRole 'admin'}}
    <h1> hello Admin </h1?
   {{else}}
   <h1> sorry bro just admin can look at this page</h1>  
  {{/if}}

使用它可以更好地控制用户的工作方式以及用户可以在模板上看到的内容,您可以创建您想要使用相同逻辑的角色类型

GL

答案 1 :(得分:1)

处理此方案的最佳方法是使用account-password Accounts.sendEnrollmentEmail选项。

var user_id = Accounts.createUser({email: someemail,username: someusername});
Accounts.sendEnrollmentEmail(user_id);

您可以创建一个没有密码的帐户,允许用户稍后通过发送到其电子邮件地址的链接添加密码。

如果此解决方案符合您的要求,则无需了解更多信息。

使用注册函数Accounts.onEnrollmentLink设置用户点击电子邮件中的链接后调用的回调函数。

根据文档,下一步是将令牌传递给Accounts.resetPassword函数。令牌和done方法作为参数传递给Accounts.onEnrollmentLink。完成方法是恢复正常的用户登录过程。 Accounts.resetPassword函数可以放在客户端。

仔细阅读文档以获取更多信息。

答案 2 :(得分:0)

实际上,任何涉及创建用户帐户并让用户传递其登录凭据的webapp都应该通过HTTPS完成。启用HTTPS后,将密码从客户端传递到服务器应该不是问题。