Как аутентифицировать пользователей, используя 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
, Это, однако, очень сложное имя для входа, хотя некоторые считают более удобными для пользователя.