如何从url中删除==%0A以便在rails中混淆我的记录的ID?

时间:2015-08-22 12:03:47

标签: ruby-on-rails openssl

使用内置的OpenSSL库加密和解密id

网址如下:http://localhost:3000/requests/Ym7c8FQQlCe5FvotzKu4yw==%0A 我想从中删除==%0A?怎么样?

require 'openssl'
require 'base64'

module Obfuscate
  def self.included(base)
    base.extend self
  end

  def cipher
    OpenSSL::Cipher::Cipher.new('aes-256-cbc')
  end

  def cipher_key
    'blah!'
  end

  def decrypt(value)
    c = cipher.decrypt
    c.key = Digest::SHA256.digest(cipher_key)
    c.update(Base64.decode64(value.to_s)) + c.final
  end

  def encrypt(value)
    c = cipher.encrypt
    c.key = Digest::SHA256.digest(cipher_key)
    Base64.encode64(c.update(value.to_s) + c.final)
  end
end

在我的模特中:

class MyModel < ActiveRecord::Base
  include Obfuscate

  def to_param
    encrypt id
  end
end

2 个答案:

答案 0 :(得分:0)

查看activeuuid

创建创建迁移时,它应该是这样的

class CreateEmails < ActiveRecord::Migration
  def change
    create_table :users, :id => false  do |t|
      t.uuid :id, :primary_key => true
      t.uuid :something_id  # belongs_to :something

      t.timestamps
    end
    add_index :emails, :id
  end
end

然后在您的模型中,您只需要包含include ActiveUUID::UUID

这是一个uuid 1dd74dd0-d116-11e0-99c7-5ac5d975667e

的示例

我希望这有助于

答案 1 :(得分:0)

另一种解决方案是使用Friendly ID。基本上,它会使用id或其他字段替换路线中的name。它改变了

/requests/Ym7c8FQQlCe5FvotzKu4yw==%0A

/requests/some_cool_name_in_your_database

这样,您的用户就不会看到id,而是会看到一些更漂亮的东西。如果您的用户要返回该页面,它仍然有效,因为您有一个有效的&#34; id&#34;。