Ruby on Rails 构建安全 API 全指南(2025)

作者:API传播员 · 2025-10-10 · 阅读时间:5分钟

在数字化时代,API 的安全性至关重要,尤其是对于使用 Ruby on Rails 开发的应用程序。本文提供全面的安全指南,涵盖从基础设置到高级安全实践,帮助开发者保护用户数据、防范潜在威胁,并构建可靠 API。


一. Ruby on Rails 构建 API 的基础

1. 创建 Rails 应用程序

rails new secure_api
rails generate scaffold Todo title:string completed:boolean

配置路由支持 JSON API:

Rails.application.routes.draw do
 namespace :api, defaults: { format: :json } do
 namespace :v1 do
 resources :todos
 end
 end
end

API 端点设置在 /api/v1 下。


二. 身份验证与授权

1. 使用 Devise 进行身份验证

Gemfile 中添加:

gem 'devise'

安装 Devise 并生成用户模型:

bundle install
rails generate devise:install
rails generate devise User
rails db:migrate

在控制器中添加身份验证过滤器:

class Api::V1::PostsController < ApplicationController
 before_action :authenticate_user!

 def index
   posts = Post.all
   render json: posts
 end
end

2. 基于角色的授权

使用 CanCanCan 管理权限:

gem 'cancancan'
bundle install
rails generate cancan:ability

定义角色和权限:

class Ability
 include CanCan::Ability

 def initialize(user)
   user ||= User.new
   if user.admin?
     can :manage, :all
   else
     can :read, Todo
     can :create, Todo
     can :update, Todo, user_id: user.id
     can :destroy, Todo, user_id: user.id
   end
 end
end

控制器中加载权限:

class Api::V1::TodosController < ApplicationController
 load_and_authorize_resource

 def index
   render json: @todos
 end
end

三. 数据验证与净化

验证输入数据

class Todo < ApplicationRecord
 validates :title, presence: true
 validates :completed, inclusion: { in: [true, false] }
end

防止 SQL 注入和 XSS

safe_name = ActiveRecord::Base.sanitize(params[:name])

确保 API 通信使用 HTTPS


四. 基于令牌的身份验证

使用 devise_token_auth 实现高安全性:

gem 'devise_token_auth'

安装并配置:

rails generate devise_token_auth:install User auth
rails db:migrate

保护控制器路由:

class Api::V1::BaseController < ApplicationController
 before_action :authenticate_user!
end

五. 防止 API 滥用和攻击

1. 使用 Rack::Attack 节流

Rack::Attack.throttle('requests by ip', limit: 100, period: 1.minute) do |request|
 request.ip
end

2. 配置 CORS 策略

gem 'rack-cors'
config.middleware.insert_before 0, Rack::Cors do
 allow do
   origins 'https://your-allowed-domain.com'
   resource '*', headers: :any, methods: [:get, :post, :put, :patch, :delete]
 end
end

六. 加密敏感数据

使用 bcrypt 加密密码:

gem 'bcrypt'

模型中启用安全密码:

class User < ApplicationRecord
 has_secure_password
end

验证密码:

user = User.find_by(email: params[:email])
if user&.authenticate(params[:password])
  # 身份验证成功
else
  # 凭据无效
end

七. 总结

通过身份验证、授权、数据验证、滥用防护和加密措施,您可以显著提升 API 安全性。Ruby on Rails 提供丰富工具和库,帮助开发者构建强大而安全的 API。牢记安全最佳实践,并定期更新应用程序,应对不断变化的安全威胁。


推荐辅助工具

原文链接: https://escape.tech/blog/ruby-on-rails-security-guide/