如何加密或隐藏网址栏上的用户ID? rails4

时间:2015-02-10 15:44:43

标签: ruby-on-rails ruby ruby-on-rails-4

现在当我点击id = 1的用户时,在网址栏上显示

  

用户/ 1

我想将其更改为

  

用户/ [加密]

  

用户/ some_user

有没有办法在rails上做到这一点?

3 个答案:

答案 0 :(得分:3)

使用固定链接而不是用户ID怎么样?即用户/ [永久链接],您可以将永久链接配置为您喜欢的任何内容,只要它是唯一值

查看friendly_id gem:https://github.com/norman/friendly_id

答案 1 :(得分:0)

在URL中显示对象时,Rails使用to_param方法。

如果您更改to_param中的user方法,则会用于显示数据而不是id

默认情况下,rails已实现to_param以返回对象的id

例如

class User < ActiveRecord::Base
  ...
  def to_param
    "#{self.first_name}-#{self.last_name}" # or whatever you want to use
  end
  ...
end

在您的网址中,您将获得/users/first_name-last_nameto_param方法返回的任何内容。默认情况下,to_param会返回id,而url会返回/users/4。在您的控制器中,您可以找到user id 4,但是当您更改to_param方法时,您必须分别更改从数据库中获取用户的方式。

实施例:  我将to_param方法更改为从数据库返回nick_name,并且它对于特定用户是唯一的,我可以使用它从数据库中查找用户。 在路由器

更改params

的映射
get 'users/:nick_name', 'users#show'

在控制器中

User.find_by :nick_name => params[:nick_name]

答案 2 :(得分:0)

像这篇文章中的其他人说的那样,我用 我用 https://github.com/norman/friendly_id这样:

  # app/models/secret.rb; this would go in the model you want to obfuscate
  class Secret < ActiveRecord::Base
    has_friendly_id :code, :use_slug => true

    validates :name, :uniqueness => true

    def code
       Digest::SHA1.hexdigest self.name
    end
  end
这很简单。如果你的安全需求很严重,你可能想要一些更复杂的东西(更不用说比基本的混淆技术更多的分层),但我想分享一种开箱即用的方式来使用已经存在的宝石(甚至可能已在您的应用中使用)