# Ruby基于Rails框架实现多角色权限管理与数据分页查询完整实战代码案例

简介: 本项目基于Rails 7实现RBAC多角色权限管理(超级管理员/运营/员工)与通用分页查询,集成Devise认证、CanCanCan鉴权及Kaminari分页,代码规范、零重型依赖,开箱即用。(239字)

Ruby基于Rails框架实现多角色权限管理与数据分页查询完整实战代码案例

一、项目概述

本案例基于Ruby on Rails 7开发,搭建一套后台管理系统核心能力:多角色RBAC权限控制+列表分页查询功能。系统划分超级管理员、运营管理员、普通员工三类角色,不同角色访问页面、操作数据权限隔离;同时封装通用分页工具类,适配所有数据表列表查询,降低重复编码成本。整套代码遵循Rails MVC规范,使用Devise做用户登录、CanCanCan实现权限校验,无第三方重型组件依赖,可直接迁移至生产环境。

二、环境依赖

  • Ruby 3.2.2
  • Rails 7.1.0
  • 数据库:PostgreSQL 14
  • 核心Gem依赖
    # Gemfile
    gem 'devise'          # 用户登录认证
    gem 'cancancan'       # RBAC权限控制
    gem 'kaminari'        # 分页插件
    gem 'pg'              # 数据库驱动
    gem 'bcrypt'
    
    执行安装命令:
    bundle install
    rails db:create && rails db:migrate
    

三、数据库模型设计

1. 用户、角色、权限关联迁移文件

# db/migrate/20260101000000_create_roles.rb
class CreateRoles < ActiveRecord::Migration[7.1]
  def change
    create_table :roles do |t|
      t.string :name, null: false, unique: true
      t.text :permissions, array: true, default: []
      t.timestamps
    end
  end
end

# db/migrate/20260101000001_add_role_id_to_users.rb
class AddRoleIdToUsers < ActiveRecord::Migration[7.1]
  def change
    add_reference :users, :role, foreign_key: true
  end
end

2. 模型代码

Role角色模型

# app/models/role.rb
class Role < ApplicationRecord
  serialize :permissions, Array
  validates :name, presence: true, uniqueness: true

  # 判断角色是否拥有指定权限
  def has_perm?(perm_code)
    permissions.include?(perm_code)
  end
end

User用户模型(集成Devise)

# app/models/user.rb
class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
  belongs_to :role

  delegate :has_perm?, to: :role

  # 校验当前用户权限
  def can_operate?(perm)
    role&.has_perm?(perm) || false
  end
end

3. 权限能力定义(Ability权限配置)

# app/models/ability.rb
class Ability
  include CanCan::Ability
  def initialize(user)
    user ||= User.new
    if user.can_operate?('super_admin')
      can :manage, :all
    elsif user.can_operate?('operation')
      can [:read, :update], User
      can [:read, :create, :update], Order
      cannot :destroy, :all
    elsif user.can_operate?('staff')
      can :read, Order
      cannot [:create, :update, :destroy], User
    end
  end
end

四、通用分页工具封装

封装全局分页方法,统一分页参数、数据返回格式

# app/controllers/concerns/pagination_helper.rb
module PaginationHelper
  extend ActiveSupport::Concern

  included do
    helper_method :paginate_data
  end

  # 通用分页处理
  def paginate_data(model_scope, page_size = 10)
    page = params[:page] || 1
    model_scope.page(page).per(page_size)
  end
end

五、业务控制器实现(订单列表示例)

# app/controllers/orders_controller.rb
class OrdersController < ApplicationController
  load_and_authorize_resource # CanCan自动校验权限
  include PaginationHelper

  # 分页订单列表
  def index
    @orders = paginate_data(Order.order(created_at: :desc), 15)
    render json: {
   
      code: 200,
      data: @orders,
      total: @orders.total_count,
      page: params[:page] || 1,
      page_size: 15
    }
  end

  private
  def order_params
    params.require(:order).permit(:order_no, :amount, :status)
  end
end

六、路由配置

# config/routes.rb
Rails.application.routes.draw do
  devise_for :users
  resources :orders, only: [:index, :create, :update]
end

七、初始化测试角色数据

# db/seeds.rb
# 超级管理员角色
Role.create!(name: 'super_admin', permissions: %w[super_admin user_create user_delete order_manage])
# 运营管理员
Role.create!(name: 'operation', permissions: %w[operation user_read order_create order_update])
# 普通员工
Role.create!(name: 'staff', permissions: %w[staff order_read])

# 创建测试管理员用户
super_role = Role.find_by(name: 'super_admin')
User.create!(
  email: 'admin@test.com',
  password: '12345678',
  role: super_role
)

执行初始化数据:rails db:seed

八、功能测试说明

  1. 登录校验:访问 /users/sign_in 输入账号密码登录,未登录会自动跳转登录页;
  2. 权限拦截:普通员工访问订单编辑接口,CanCanCan抛出权限异常,返回403;
  3. 分页接口请求示例:GET /orders?page=1,返回分页列表、总条数、页码信息;
  4. 扩展方式:新增角色仅需在seeds新增Role记录,配置对应权限编码即可,无需修改控制器逻辑。

九、优化拓展方案

  1. 前端增加权限按钮渲染判断,无权限按钮隐藏;
  2. 分页工具增加排序、模糊查询参数封装;
  3. 增加接口全局异常捕获,统一返回错误JSON格式;
  4. 缓存角色权限数据,减少数据库查询次数,提升接口响应速度。

海量精选技术文档和实战案例持续更新,敬请关注【风骏时光少年】

相关文章
|
21天前
|
机器学习/深度学习 人工智能 监控
8类工地安全防护用品检测5200张数据集分享
本数据集含5200张真实工地实景图像,精细标注8类安全目标(安全帽、反光背心、施工人员等),YOLO格式,开箱即用。适用于智慧工地监管、PPE合规检测及YOLOv5-v11等模型训练,助力工业安防与目标检测研究。
|
4天前
|
人工智能 JSON 自然语言处理
阿里云百炼Token Plan产品详解:产品功能、支持模型与Agent工具、套餐和Credits价格介绍
阿里云百炼Token Plan团队版是面向企业与开发团队的预付费AI大模型订阅服务,以统一Credits计量,整合Qwen、DeepSeek、Kimi等多厂商文本与图像生成模型,兼容OpenAI/Anthropic标准接口,适配Qwen Code、OpenClaw等主流AI编程与智能体工具。产品提供198元/月(标准)、698元/月(高级)、1398元/月(尊享)三档坐席套餐,搭配5000元共享用量包,支持席位分配、用量分析与SSO集成,承诺不使用对话数据训练模型,多租户隔离架构保障高峰不排队。
|
2月前
|
消息中间件 网络协议 测试技术
socket长连接在手游场景下的技术实践
本文介绍了37手游基于B站goim框架自研长连接系统的实践。系统采用分层设计,支持多协议和发布/订阅机制,用于直播弹幕、实时推送等场景,实现了高性能与业务适配。
201 4
socket长连接在手游场景下的技术实践
|
21天前
|
人工智能 IDE API
OpenCode 是什么?——终端里的开源 AI 编程 Agent 完全解读
2026年,Anthropic封禁第三方调用Claude Code,引爆开发者对“供应商锁定”的焦虑。开源工具OpenCode应运而生——MIT协议、终端原生、支持75+模型,首创Plan/Build双模式,将模型选择权、成本控制权与数据主权彻底交还开发者。
|
1月前
|
人工智能 JSON 测试技术
3人团队搞定500+接口:用Skills构建可复用的“测试技能库”,复用率提升80%
本文直击接口自动化测试痛点:脚本重复率高、复用率不足20%、维护成本飙升。提出“测试技能库”新范式——将校验逻辑提炼为可检索、可组合、带契约的“技能”,实现从“代码复用”到“能力复用”的跃迁。含三层架构、落地三步法与真实订单案例,助团队降本增效。
|
21天前
|
人工智能 5G Shell
90%的人不知道!MiMo Code 凭什么免费开放百万 Token 大模型?深度拆解来了
MiMo Code 是小米推出的免费终端AI编码代理,内置MiMo-V2.5百万Token免费模型。本文详细讲解安装部署、模型配置、三大核心模式、会话管理等全链路技能,让你快速掌握这款AI开发工具。
781 2
|
21天前
|
人工智能 数据可视化 开发工具
Codex 新增/usage 系列命令:自适应主题查看token消耗
OpenAI Codex 新增 `/usage` 系列命令,支持在终端实时查看 Token 消耗(总体/日/周/累计),采用异步加载、主题自适应渲染与瞬态卡片设计,将成本管理无缝融入开发工作流,标志着其从代码助手向“AI 开发操作系统”演进的关键一步。(239字)
340 1
|
1月前
|
SQL 安全 程序员
《ZAKU渗透论:卓伊凡的2026渗透工程》第三章:Web攻击原理(上)——注入与SQL注入
本章详解Web攻击核心——注入与SQL注入。通过“小明输入‘小明’OR‘1’=‘1’秒变管理员”的生动案例,揭示攻击本质:程序混淆数据与代码,导致恶意SQL被执行。深入剖析万能密码、数据窃取、权限绕过等危害,并指出漏洞长期存在的根源:历史代码、意识不足与修复成本。
284 2
|
安全 API
如何通过静态凭据连接阿里云MCP Server(持续更新)
阿里云API MCP Server是阿里云官方提供的MCP服务,支持自定义API调用与Core模式全量集成。本文详解静态凭据连接方式:需安装官方应用、RAM授权、配置AccessKey,并在Qoder等客户端完成环境变量或CLI集成,实现安全高效的云服务调用。(239字)
如何通过静态凭据连接阿里云MCP Server(持续更新)
|
2月前
|
人工智能 自然语言处理 供应链
为什么 MCP 在协议层会有 prompt injection的问题:工具描述如何劫持 agent 上下文
MCP(Model Context Protocol)虽成AI Agent主流集成标准,但其将工具描述全量注入上下文的设计,导致“Context Poisoning”——恶意指令可借工具元数据污染LLM推理。OWASP将其列为LLM应用头号漏洞,2025年已致超10万站点遭袭。根本风险在于协议层信任模型缺失,非清洗不可用。
212 12
为什么 MCP 在协议层会有 prompt injection的问题:工具描述如何劫持 agent 上下文