`
hideto
  • 浏览: 2678345 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

每天一剂Rails良药之Role-Based Authorization

    博客分类:
  • Ruby
阅读更多
我们的系统往往并不只是靠登录这么简单来控制权限,今天我们来看看基于角色的授权
假设我们的系统已经建立了昨天的users表

1,migration
class AddRolesAndRightsTables < ActiveRecord::Migration
  def self.up
    create_table :users_roles, :id => false do |t|
      t.column :user_id, :integer
      t.column :role_id, :integer
    end

    create_table :roles, :do |t|
      t.column :name, :string
    end

    create_table :roles_rights, :id => false do |t|
      t.column :role_id, :integer
      t.column :right_id, :integer
    end

    create_table :rights do |t|
      t.column :name, :string
      t.column :controller, :string
      t.column :action, :string
    end
  end

  def self.down
    drop_table :users_roles
    drop_table :roles
    drop_table :rights
    drop_table :rights_roles
  end
end


2,model
class User < ActiveRecord::Base
  has_and_belongs_to_many :roles
end

class Role < ActiveRecord::Base
  has_and_belongs_to_many :users
  has_and_belongs_to_many :rights
end

class Right < ActiveRecord::Base
  has_and_belongs_to_many :roles
end


3,application.rb
class ApplicationController < ActionController::Base
  layout 'standard'
  before_filter :check_authentication,
                :check_authorization,
                :except => [:signin_form, :signin]
  def check_authentication
    unless session[:user]
      session[:intended_action] = action_name
      redirect_to :controller => :admin, :action => signin_form
      return false
    end
  end

  def check_authorization
    user = User.find(session[:user])
    unless user.roles.detect{|role|
        role.rights.detect{|right|
          right.action == action_name && right.controller == controller_name
        }
      }
      flash[:notice] = "You are not authorized to view the page you requested"
      request.env["HTTP_REFERER"] ? (redirect_to :back) : (redirect_to home_url)
      return false
    end
  end
end
end


4,layout
<% if flash[:notice] %>
  <div class="errors">
    <% flash[:notice] %>
  </div>
<% end %>


如果我们的某一个controller或者action不想要check_authentication和check_authorization这两个filter,我们可以skip掉:
class HomeController < ApplicationController
  skip_before_filter :check_authentication, :check_authorization
  def index
    render :text => "A page that doesn't require a signin or any rights"
  end
end

但这只能精确到controller和action级别的权限控制
如果我们想控制对models实例的访问权限,可以参考Bruce Perens的ModelSecurity
分享到:
评论
1 楼 javafansmagic 2011-06-30  
Good~ 

相关推荐

    rails-hackernews-reddit-producthunt-clone, 黑客 news/reddit/social 链接分享网站 用 Rails 构建.zip

    rails-hackernews-reddit-producthunt-clone, 黑客 news/reddit/social 链接分享网站 用 Rails 构建 Rails 上的 Reddit-Hackernews-ProductHunt克隆演示 这是一个 readme.md的Ruby on Rails 应用程序,模仿了 Hacker...

    Agile Web Development with Rails-Second Edition-Beta一书例子

    《Agile Web Development with Rails-Second Edition-Beta》是一本专注于使用Ruby on Rails进行敏捷Web开发的书籍。这本书的第二版beta版提供了关于如何利用Rails框架高效构建动态、响应式网站的深入指导。作者们...

    rails3-mongoid-devise, 示例 Rails 3.2应用,带有数据 Mongoid,用于验证.zip

    rails3-mongoid-devise, 示例 Rails 3.2应用,带有数据 Mongoid,用于验证 Rails 4.1有关设计的Rails 4.1示例应用程序,请参见:rails设计有一个用于设计的教程:Rails 设计教程。类似示例和教程这是来自 RailsApps...

    rails-documentation-2-0-2

    rails-documentation-2-0-2

    awesome-rails-gem-zh_CN, Rails 常用 Gem 列表 - Awesome Rails Gem 中文版.zip

    在这个压缩包中,`awesome-rails-gem-zh_CN-master`可能是项目源码或文档的主目录。以下是一些可能包含在列表中的关键Rails Gem及其功能简介: 1. **Devise**:这是一个灵活的身份认证解决方案,提供了一套完整的...

    rails-beginner-s-guide

    rails-beginner-s-guide是Rails 指导手册,帮组学习了解rails开发

    Rails管理框架upmin-admin.zip

    upmin-admin 是一个为 Rails 应用开发的开源管理框架。用来管理 Rails 应用中各种对象(如 Model、View 和 Controller )。 标签:upmin

    关于rails 3.1 cucumber-rails 1.2.0

    Rails 3.1 和 Cucumber-Rails 1.2.0 是两个在Web开发领域非常重要的工具,尤其对于Ruby on Rails框架的测试和自动化流程。本文将深入探讨这两个组件,以及它们如何协同工作来增强软件开发的效率和质量。 首先,...

    rails-documentation-1-2-0-rc1.chm

    rails-documentation-1-2-0-rc1.chm

    rails-dev-box, 面向 Ruby on Rails 核心开发的虚拟机.zip

    rails-dev-box, 面向 Ruby on Rails 核心开发的虚拟机 用于 Ruby on Rails 核心开发的虚拟机简介注意:这个虚拟机不是为 Rails 应用程序开发而设计的,只是为。 这个项目自动设置开发环境,以便在 Ruby on Rails ...

    rails-chm-2-0-2.rar

    `rails-chm-2-0-2.rar` 是一个针对Rails 2.0.2版本的CHM(Compiled HTML Help)文件,这种格式通常用来存储组织化的HTML文档,便于用户离线浏览。这个压缩包包含了一份完整的Rails 2.0.2帮助文档,是学习和使用Rails...

    rails-documentation-1-2-1.zip

    标题 "rails-documentation-1-2-1.zip" 暗示这是一份关于 Ruby on Rails 框架的文档,版本为 1.2.1。Ruby 是一种面向对象的编程语言,而 Rails 是一个基于 Ruby 的开源 Web 应用程序框架,遵循 Model-View-...

    rails-react-components-源码.rar

    本文将深入探讨"rails-react-components-源码.rar"中的关键知识点,帮助开发者理解如何在Rails应用中集成React组件。 1. **React组件化开发** React的核心概念是组件,它允许我们将UI拆分为独立、可重用的部分。在...

    RVM+Ruby1.9.3+Rails3(1-Cygwin 安装配置)

    在 Windows 7 环境下搭建 Rails 3 开发环境是一项颇具挑战性的任务,尤其是当涉及到 Cygwin、Ruby、Rails 以及一系列其他必要的组件时。本文将详细阐述如何在 Windows 7 系统上利用 Cygwin 进行环境搭建,包括 Git、...

    Scrum Poker in Rails5, docker-compose

    这个配置会创建一个Rails应用服务、一个PostgreSQL数据库服务和一个Redis服务,确保所有组件正确连接并运行。 总之,结合Rails5和Docker Compose,我们可以构建一个强大的Scrum Poker应用,提供实时的估算讨论环境...

Global site tag (gtag.js) - Google Analytics