Как аутентифицировать пользователей, используя rubycas-сервер с несколькими полями?

Я использовал rubycas-server для построения систем sso, используя devise для работы с системой пользователя, но теперь мой вопрос заключается в том, чтобы rubycas-server использовал только одно поле, например "email", я хочу использовать "email" / "tel" / "nickname" 'для входа пользователя. больше нет информации в вики

authenticator:
 class: CASServer::Authenticators::SQLBcrypt
 database:
   adapter: mysql2
   database: xxxx
   username: root
   password: xxxx
   host: localhost
 user_table: users
 username_column: email # tel/nickname
 password_column: encrypted_password

извините за мой плохой английский! помогите мне, большое спасибо!

2 ответа

Решение

Измените следующий код в rubycas-server/lib/casserver/authenticators/sql_bcrypt.rb

  def matching_users
    results = user_model.find(:all, :conditions => ["#{username_column} = ?", @username])
    results.select { |user| BCrypt::Password.new(user.send(password_column.to_sym)) == @password }
  end

в

  def matching_users
    if username_column.include?(',')
      columns = username_column.split(',')
      sql = ''
      conditions = []
      columns.each do |field|
        if sql.length != 0
          sql += ' or '
        end
        sql += "#{field} = ?"
        conditions << @username
      end
      conditions.unshift(sql)
    else
      conditions = ["#{username_column} = ?", @username]
    end
    results = user_model.find(:all, :conditions => conditions)
    results.select { |user| BCrypt::Password.new(user.send(password_column.to_sym)) == @password }
  end

тогда вы можете использовать mutli-fieds в config.yml следующим образом:

authenticator:
 class: CASServer::Authenticators::SQLBcrypt
 database:
   adapter: mysql2
   database: test
   username: root
   password: map
   host: localhost
 user_table: users
 username_column: email,nickname,tel
 password_column: encrypted_password

Я боюсь, что это будет невозможно. Как видно из официального репозитория, этот аутентификатор просто сопоставляет имя столбца с именем пользователя:

  def matching_users
    results = user_model.find(:all, :conditions => ["#{username_column} = ?", @username])
    results.select { |user| BCrypt::Password.new(user.send(password_column.to_sym)) == @password }
  end

Для вашего случая лучше всего написать собственный аутентификатор, соответствующий email/tel/nickname, Это, однако, очень сложное имя для входа, хотя некоторые считают более удобными для пользователя.

Другие вопросы по тегам