如何使用具有多字段的rubycas-server对用户进行身份验证?

时间:2014-11-10 05:47:11

标签: ruby-on-rails ruby single-sign-on rubycas-server

我使用rubycas-server来构建一个sso系统,使用devise来完成用户的系统,但现在我的问题是,rubycas-server只有一个字段,比如'email',我想使用'email' /'tel'/'nickname'用于用户登录。 wiki

中没有更多信息
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 个答案:

答案 0 :(得分:4)

我担心它会变得可能。从官方repository可以看出,此验证器只是将给定的列名与用户名匹配:

  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匹配的自定义身份验证器。然而,这是非常难以登录的名称,考虑一些更友好的用户。

答案 1 :(得分:1)

在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

然后你可以在config.yml中使用mutli-fieds,如下所示:

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