Просмотр исходного кода

impl register user with minimum fields

Yuki Takei 8 лет назад
Родитель
Сommit
f1c819964d
2 измененных файлов с 46 добавлено и 10 удалено
  1. 18 0
      lib/models/user.js
  2. 28 10
      lib/service/passport.js

+ 18 - 0
lib/models/user.js

@@ -694,6 +694,24 @@ module.exports = function(crowi) {
     });
   };
 
+  /**
+   * The wrapper function of createUserByEmailAndPassword
+   *
+   * @return {Promise<User>}
+   */
+  userSchema.statics.createUser = function(name, username, email, password, lang) {
+    const User = this;
+
+    return new Promise((resolve, reject) => {
+      User.createUserByEmailAndPassword(name, username, email, password, lang, (err, userData) => {
+        if (err) {
+          return reject(err);
+        }
+        return resolve(userData);
+      });
+    });
+  }
+
   userSchema.statics.createUserPictureFilePath = function(user, name) {
     var ext = '.' + name.match(/(.*)(?:\.([^.]+$))/)[2];
 

+ 28 - 10
lib/service/passport.js

@@ -158,13 +158,7 @@ class PassportService {
         const opts = {
           usernameField: PassportService.USERNAME_FIELD,
           passwordField: PassportService.PASSWORD_FIELD,
-          server: {
-            url,
-            bindDN,
-            bindCredentials,
-            searchBase,
-            searchFilter,
-          }
+          server: { url, bindDN, bindCredentials, searchBase, searchFilter }
         };
         debug('ldap configuration: ', opts);
         callback(null, opts);
@@ -172,9 +166,16 @@ class PassportService {
     };
 
     passport.use(new LdapStrategy(getLDAPConfiguration,
-      (user, done) => {
-        debug("LDAP authentication has successed");
-        return done(null, user);
+      (ldapUserInfo, done) => {
+        debug("LDAP authentication has successed", ldapUserInfo);
+
+        this.findOrRegisterUserByLdapInfo(ldapUserInfo)
+          .then((user) => {
+            done(null, user);
+          })
+          .catch((err) => {
+            done(null, false, { message: err });
+          });
       }
     ));
 
@@ -182,6 +183,23 @@ class PassportService {
     debug('LdapStrategy: setup is done');
   }
 
+  findOrRegisterUserByLdapInfo(ldapUserInfo) {
+    const User = this.crowi.model('User');
+    const username = ldapUserInfo['uid'];
+
+    return User.findUserByUsername(username)
+      .then((user) => {
+        if (user != null) {
+          debug(`LdapStrategy: username ${username} is found `, user);
+          return user;
+        }
+        else {
+          debug(`LdapStrategy: username ${username} is not found, it is going to be registered.`);
+          return User.createUser('', username, undefined, undefined, undefined);
+        }
+      });
+  }
+
   /**
    * setup serializer and deserializer
    *