gpt4 book ai didi

mysql - 我如何将 Rails 用户身份验证/授权与 MySQL 数据库服务器中的现有权限相关联?

转载 作者:行者123 更新时间:2023-11-29 03:43:36 25 4
gpt4 key购买 nike

我们有一个 MySQL 数据库服务器,里面有很多数据库。我们在服务器中有很多用户帐户,它们控制着对各种数据库的访问。我想将 Rails 应用程序绑定(bind)到这些预先存在的帐户中。我能找到的每个身份验证系统(到目前为止有 4 个)都假定我将创建一个专用于“用户”模型的表。我只想使用 mysql.user 表进行身份验证,使用 mysql.db 表进行授权。是否有任何 Rails 身份验证系统可以使用“真正的”MySQL 权限系统,而不是将一个放在数据库的顶部?这甚至是可取的吗?如果我必须自己编写代码,是否有人预见到这种方法存在潜在的困难?

最佳答案

所以我看到这得到了支持,并注意到我从未发布过我所做的事情。这是我整理出来的。 “GINA”是一个单独的遗留数据库,用于保存数据和用户帐户。我在 database.yml 中为该连接创建了一个 YAML 节,并修改了用户模型来处理模式。

用户.rb

class User < ActiveRecord::Base
establish_connection :gina
self.table_name = "mysql.user"
self.primary_key = "user"
end

用户 Controller .rb

def authenticate
user = params[:username]
pass = params[:password]
valid = authenticate_user(user, pass)
if valid
session[:username] = user
session[:password] = pass
cookies[:username] = user
cookies[:password] = pass
redirect_to gina_tables_path
else
redirect_to gina_tables_path, :notice => "Login failed."
end
end

应用程序 Controller .rb

def authenticate_user(user, pass)
begin
u = nil if u == 'root'
u = User.find(user) # <- Here's the call to get the user, with password.
unless u.nil?
hash = "*" + Digest::SHA1.hexdigest(Digest::SHA1.digest(pass)).upcase
old_hash = old_password(pass)
if u.Password === hash || u.Password === old_hash
session[:username] = user
return true
end
return false
end
rescue Exception => e
Rails.logger.info(e)
return false
end
end

由于 User 模型以用户名字符串为键,因此 User.find(user) 从 MySQL 的用户表中获取用户,这带来了它的散列密码。所以整个技巧归结为使用与 MySQL 使用的完全相同的密码散列,并将该散列(提供的密码)与数据库中该用户的散列进行比较。如果它们相等,那就是经过身份验证的登录。

关于mysql - 我如何将 Rails 用户身份验证/授权与 MySQL 数据库服务器中的现有权限相关联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9810919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com