Rails 5.2中的Credentials和Active Storage

看到很多朋友们对Rails 5.2里的新东西,感觉云里雾里的,不太清楚它们究竟为我们提供了什么便利,所以我这里主要讲讲新版本中的Credentials和Active Storage。

为什么使用credentials?

先回顾在5.2版本以前,我们为了处理很多私密的信息,需要在.gitignore里加入多少的yml文件,有secrets.ymldatabase.ymlcable.yml,甚至会加入一些自定义的配置文件,如:application.yml

然后在部署配置中:

set :linked_files, fetch(:linked_files, []).push('config/database.yml', 'config/secrets.yml', 'config/cable.yml'...)

而我们升级到Rails 5.2后,很可能,只需要在.gitignore加入master.key一个文件,就可以处理所有的私密信息了。究竟credentials.yml.encmaster.key是怎么办到的呢?

把私密信息放入credentials中

因为我们在使用credentials.yml.enc后,可以把所有私密的信息都放到里面,然后通过master.key进行解密。所以当我们团队在一起完成一个项目时,需要分享master.key文件,但是考虑到安全的问题,不要把master.key上传到git的仓库中。

当我们打开credentials.yml.enc发现内容是一串随机串,如下:

qEbH/+fadmlPVeMVgFvpwk4ADadW2LbMkzMKJKkHrZeFNooiKKJvOoe5YJlbab1wJLHL77nSohvEm6MYnl9krXLFnDG0iSWm/svtipruMCc1FVfhSpmXSvLNJI1RUk2VeZCFjYkT8/PG4N7oj1OLrSq4yeRsbKTrS/3izcMm9ndJkcd4/wR7WAMReQSRGt5YGNZ4E3Jt9Wgg7ls2okZcwxEv/3brdgIyHrmfyEWb50YSe5oDDyscfRNX70uwZieSVGn99fFcexYUL8F0dxSrVNaix/h/UAeApq6Ifhs0/p9eXk0349f8dEMFkp5A3I4j0ubgjZ/ncdLTct37OxxhfucWukCtP6oSFvpC+5ma2epjjTSJM25+Vv3GQy7xfSdwbsEq8jm3tqT/zGr2M9iRuEX+LJrxzhDHnHC0--jQ+G6M9HWGe7zlFb--ltdsqYuI+4O8cqw/bcJRJw==

非常棒,secret_key_base之类的信息都在里面安全的保护着,可是如果我要修改里面的内容,怎么办?我们不可能直接修改加密后的内容啊。

不要着急,Rails这里给我们提供了一个方便的方法:EDITOR="mate --wait" bin/rails credentials:edit。当然,EDITOR的信息需要根据我们使用的工具进行调整。

EDITOR=vim bin/rails credentials:edit  # 使用VIM编辑
EDITOR="subl --wait" bin/rails credentials:edit  # 使用Sublime编辑

输入命令后,我们可以清楚的看到里面的内容:

# aws:
#   access_key_id: 123
#   secret_access_key: 345

# Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
secret_key_base: 0b4d8892f41d7b89127b3ad997ca9ca581fe7f84bf890c85095b635c651a9de00edd1032aeb377a5753f0236e526cb61d995d01fc3d52bb5644a33dbfbc69335

所以我们就可以在里面输入需要加密的信息,例如输入在生产环境里,数据库的密码:

...
production:
  database:
    database: project
    password: 9f797275f3f
...

然后在我们需要用到这些加密信息的地方,调用:

Rails.application.credentials[Rails.env][:database][:database]
Rails.application.credentials[Rails.env][:database][:password]

剩下部署的时候,就记得把master.key放到服务器里,不要弄丢了。

如何使用Active Storage

因为Active Storage和Rails结合紧密,所以使用起来很方便。在项目中运行rails active_storage:install,就会发现生成了一个数据迁移的文件,里面会给我们加入两个表,分别是active_storage_blobs(储存文件信息)active_storage_attachments(与业务表的多对多关系)

如果我们需要在Project模型中,保存image信息时,就不需要像使用CarrierWave时,在Project中另外添加字段,因为Active Storage会把文件信息直接保存到active_storage_blobsactive_storage_attachments中,我们只需要在Project的模型中加入:

has_one_attached :image  # 一对一关系 或
has_many_attached :images  # 一对多关系

在控制器里的参数保护也不需要做特殊的处理,只需要保持正常的设置就可以了。

params.require(:project).permit(..., :image)   # 一对一关系 或
params.require(:project).permit(..., images: [])   # 一对多关系

通过Active Storage上传的文件会保存在哪里?

通过config/storage.yml,我们可以看到:

test:
  service: Disk
  root: <%= Rails.root.join("tmp/storage") %>

local:
  service: Disk
  root: <%= Rails.root.join("storage") %>

默认的testlocal是保存在本地的Disk中的,local默认把文件保存在storage文件夹中,所如果我们想要把文件保存在public内,可以修改成:

 root: <%= Rails.root.join("public/storage") %>

当然无论我们保存在什么位置,记得把该目录加入到.gitignore中。

那么在开发环境中,它是如何知道使用local配置的呢?在config/environments/development.rb中,我们可以看到:

# Store files locally.
config.active_storage.service = :local

所以,如果我们生产环境也希望保存在Disk的话,只需要修改config/environments/production.rb即可,当然我们会建议使用云服务,因为结合Active Storage可以让一切变得很简单,例如保存在aws,只需要:

# config/environments/production.rb
# Store files on Amazon S3.
config.active_storage.service = :amazon

# config/storage.yml
amazon:
  service: S3
  access_key_id: ""
  secret_access_key: ""
  region: ""
  bucket: ""

在前端,可以看到application.js里加入了//= require activestorage,通过activestorage可以使用<%= form.file_field :image, direct_upload: true %>,全交给客户端直接往云服务器上传文件,避免经过服务器。

同时,如果需要调整图片尺寸大小时,我们加入gem 'mini_magick'后,直接在页面就可以对图片尺寸进行处理:

<%= image_tag project.image.variant(resize: "100x100") %>

参考:
Rails 5.2: Active Storage and beyond
Active Storage Environment-Specific Credentials
Encrypted Credentials — A new way to use Secrets in Rails 5.2
Rails 5.2 credentials

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容