如何登录预先认证的用户?

时间:2015-09-28 13:55:48

标签: meteor meteor-accounts

如何使用预先验证的身份验证请求登录用户?

身份验证由https://www.netiq.com/处理,请求通过包含用户名,角色等的http标头传递给Meteor。如何在Meteor中填充用户对象并进行授权?

来自Java和Spring Security,我使用了https://github.com/spring-projects/spring-security/blob/master/web/src/main/java/org/springframework/security/web/authentication/preauth/PreAuthenticatedAuthenticationProvider.java

1 个答案:

答案 0 :(得分:1)

在服务器上,使用类似这样的内容(未经测试)注册登录处理程序:

Accounts.registerLoginHandler("netiqPreauth", function(options) {
  var self = this;
  if (! options || ! options.netiqPreauth || 
      ! self.connection || ! self.connection.httpHeaders) {
    return undefined;
  }

  // parseHeaders() parses the headers into a userDetails object.
  var userDetails = parseHeaders(self.connection.httpHeaders);

  // Code below assumes userDetails.username is unique
  var existingUser = Meteor.user.findOne({ "services.netiq.username": userDetails.username });
  if (existingUser) {
    if (EJSON.stringify(existingUser.services.netiq) !== EJSON.stringify(userDetails)) {
      Meteor.users.update(existingUser._id, { 
        $set: { "services.netiq": userDetails }, // Update details
        $unset: { "services.resume.loginTokens": "" } // Force logout
      });
    }
    return { userId: existingUser._id };
  }  
  var newUserId = Accounts.insertUserDoc(options, {
    profile: { /* whatever */ }, // Optional
    services: {
      netiq: userDetails
    }  
  });
  return {
    userId: newUserId
  };
});

只会在用户登录时更新与用户关联的详细信息。如果您有某种方式在用户的详细信息更改时通知服务器,您可以让服务器更新详细信息并删除现有信息与用户关联的令牌(如上面的代码中所示)。删除令牌会将用户注销到他们可能登录的任何位置。删除用户也会将用户注销。

如果您没有办法收到有关用户详细信息更改的通知,您也可以拨打Accounts.config({ loginExpirationInDays: some_suitably_short_time_period } )(在客户端和服务器上)经常注销用户。< / p>

要在中记录用户,您需要在客户端上调用Accounts.callLoginMethod()。如果您想在用户退出时自动将用户重新登录,您可以执行以下操作(未经测试):

Meteor.startup(function(){
    Tracker.autorun(function () {
      if (! Meteor.userId()) {
        Accounts.callLoginMethod({
          methodArguments: [{
            netiqPreauth: true
          }],
          userCallback: function (error) {
            if (error) {
              // handle error
            } else {
              // handle success
            }
          }
        });
      }
    });
  });
}