`
andrew.yulong
  • 浏览: 169762 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

rails 权限控制

阅读更多

安装地址:git clone git://github.com/stffn/declarative_authorization.git vendor/plugins/declarative_authorization

 

这里不在svn上面,需要安装git(自己google)

1.在user模型是上加roles字段,该字段存储权限

 

2.打开application_controller,添加

 before_filter :set_current_user
  protected
  def set_current_user
    Authorization.current_user = current_user
  end 

 这个全局的前置过滤器,会把restful authentication的current_user代入到declarative authorization的同名方法current_user中。注意,这两个current_user都是Session对象,里面装载着我们的User对象,这就保证了我们多个页面中可以保存用户的信息。如果restful authentication的current_user为空,declarative authorization就会创建一个匿名的User对象,把它放进declarative authorization的current_user中。它拥有一个role_symbols属性(这就是为什么我们自定义的User模型要添加一个role_symbols方法),值为guest。而guest实质是declarative authorization为我们预设的默认角色,当请求和任何用户都没有关联或当一个用户没有任何角色时被调用。这样就实现了User与Role的关联了。

 

3.打开users_controller,开启控制器级别的访问控制。

class UsersController < ApplicationController
  filter_access_to :all
  filter_access_to [:show, :edit, :update], :attribute_check => true
 #………………
end
这里涉及到两个名词:粗粒度与细粒度

粗粒度:表示类别级,只检查对象的类别(Class),而不追究其某一个特定的实例。

细粒度:表示实例级,即需要考虑具体对象的实例(Instance)。比如,只有本人才能查看与编辑自己的用户资料。这个我们通过比较ID或某个特定的属性可以实现,因此:arrtibute_check => true(开启属性检查)就是为这准备的。

更绝的是我们还可以开启模型级别的访问控制,系统就会根据你的权限重写查询指令,防止数据被非法操纵。

 

4.为了实现授权规则与业务逻辑相分离,declarative authorization指定把所有的授权规则都定义到一个配置文件中,并为我们提供专门的DSL来编写授权规则。首先,我们得把\vendor\plugins\declarative_authorization目录下的样本authorization_rules.dist.rb复制到config目录下,并更名为authorization_rules.rb。打开authorization_rules.rb

authorization do

  role :guest(guest角色,默认) do

    has_permission_on :users(作用于模型), :to => [:read_index,:create](允许执行的action)

  end

 

  role :wikier(角色名称) do

    includes :guest

    has_permission_on :users, :to => [:read_show,:update] do

      if_attribute :id => is {user.id}

    end

  end

 

  role :providence_breaker do

    has_permission_on :users, :to => :manage

  end

end

 

privileges do

  privilege :manage, :includes => [:create, :read, :update, :delete]

  privilege :read, :includes => [:index, :show]

  privilege :read_index, :includes => :index

  privilege :read_show, :includes => :show

  privilege :create, :includes => :new

  privilege :update, :includes => :edit

  privilege :delete, :includes => :destroy

end

 

5. 在控制器加上这个方面,权限不通过时跳到知道页面

protected  
  def permission_denied  
    respond_to do |format|  
      format.html { redirect_to '/403' }  
      format.xml  { head :unauthorized }  
      format.js   { head :unauthorized }  
    end  
  end  
 

最后,User模块通常是应用程序最重要的地方,编辑删除等操作一般只能由管理员来执行,用户就算能抵及这种敏感的地带,也一般是一个被阉割了的编辑界面。例如User模型中的login与password用来让用户登录程序,一般是不让修改,所以我们在表单中disabled了这个域,密码更是用了SHA1 加密,不可反向破译,干脆不提供修改。为了保护User模型大部分字段的安全,我们还用了“白名单”;这个restful_authentication插件已经为了我们做了,但roles字段是我们后来添加的,我们得动手修改一下。在User模型的 attr_accessible方法的最后添加上roles便是,即:

 

attr_accessible :login, :email, :name, :password, :password_confirmation,:roles

再在模型中添加以下代码(超重要)

 

 def role_symbols
    @role_symbols ||= (roles || []).map {|r| r.to_sym}
 end
 

 

 

 

分享到:
评论
2 楼 andrew.yulong 2010-07-15  
他默认有个guest角色啊
1 楼 liucuan 2010-07-12  
如果想过滤这个插件怎么过滤,比如我的index页面我想登录不登录都可以访问,我装了这个插件貌似只能登录的用户才能权限控制

相关推荐

    Rails 101 入门电子书

    - 加入权限控制。 - 保护敏感数据。 #### 十一、练习作业4-User可以加入、退出社团 - **目标**: - 用户能够加入或退出特定Group。 - **实现过程**: - 添加Join/Quit操作。 - 更新数据库结构。 - 实现逻辑...

    RailsGacl Rails应用 通用访问控制列表

     RailsGACL 是一组允许你控制对象(用户,远程主机等)访问其他对象(网页,数据库等)权限的函数.  该组函数可以通过简单的管理提供高精度的访问控制,并且运行地很快.  它是用 Rails,一种当前十分被看好的被用来...

    rails本地安装包完整版

    2. **actionpack-2.1.0.gem**:ActionPack是Rails框架中的另一块关键组件,它包括了路由系统、控制器和视图的相关功能。路由系统负责将HTTP请求映射到控制器的特定动作,控制器则处理业务逻辑,并与模型交互,最后由...

    Ruby on Rails实践

    Rails还提供了丰富的插件和gem库,如Devise用于身份验证,CanCanCan处理权限控制,Pundit管理授权,Bootstrap-Sass和jQuery-rails用于前端界面和交互。开发者可以方便地通过Gemfile引入这些工具,然后利用Bundler...

    rails-1.0.0

    10. **社区和生态系统**:Rails拥有庞大的开发者社区,产生了许多优秀的第三方Gem库,如Devise(身份验证),Paperclip(文件上传),Pundit(权限控制)等,丰富了Rails的功能。 Rails 1.0.0的发布标志着Web开发...

    Ruby-Acl9一个Rails基于角色的授权系统

    这个库的出现使得在Rails应用中实现复杂的权限控制变得更加简单和直观。Acl9的设计理念是通过定义角色(roles)及其允许执行的操作(permissions),来控制不同用户对资源的访问。 首先,让我们深入理解一下Acl9的...

    Ruby on Rails入门权威经典

    同时,也会涉及控制器的过滤器,如before_action和after_action,这些是实现业务逻辑和权限控制的关键。 Rails还提供了丰富的内置功能,如测试框架Rspec和Capybara,用于编写自动化测试;以及Asset Pipeline,用于...

    Rails上的API:使用Rails构建REST APIAPIs on Rails: Building REST APIs with Rails

    3. **实现控制器**:针对每个路由编写相应的控制器方法,如`index`用于获取所有用户列表、`show`用于显示单个用户的详情等。 4. **添加认证逻辑**:为了保护敏感数据,可以使用Devise或其他认证插件实现用户登录验证...

    ruby on rails for dummies

    书中可能还会涉及Rails的插件和gem(Ruby的包管理器),如Devise用于用户认证,CanCanCan或Pundit进行权限控制,以及Resque或Sidekiq处理后台任务。另外,部署Rails应用到Heroku、AWS或其他云平台也可能被提及,让...

    rails 的安装

    不过,Ruby on Rails是一个庞大的生态系统,有很多深入的主题值得探索,如MVC架构、ActiveRecord、路由、控制器、视图、测试等。随着对Rails的理解加深,你将能够构建更复杂的Web应用。学习和实践是掌握Rails的关键...

    ruby on rails在线考试系统

    例如,Devise用于用户认证,Cancancan进行权限控制,Paperclip或Carrierwave处理文件上传等。 8. 安全性:Rails内置了一些安全特性,如CSRF(跨站请求伪造)防护、XSS(跨站脚本攻击)防护以及参数过滤等。在考试...

    InspiniaAdmin 2.6.1 Rails_Full_Version

    1. **用户认证与授权**:内置了用户注册、登录、权限管理等功能,可以轻松实现用户身份验证和角色权限控制,确保后台的安全性。 2. **数据可视化**:集成了一系列图表库,如Chart.js和Morris.js,用于数据展示和...

    关于Rails登录和验证插件http_authentication restful-authentication

    在Rails应用中,可以使用如CanCanCan或Pundit这样的库来实施复杂的权限控制。 4. **路由(Routing)**: RESTful-Authentication利用Rails的RESTful路由,将URL映射到特定的控制器动作,如/users/login对应于sessions...

    Rails Tutorial 中文版

    10. **Rails插件和 gems**:Rails社区提供了大量预构建的解决方案,如Devise(身份验证)、Cancancan(权限管理)、Paperclip或Carrierwave(文件上传)等,学习如何使用和集成这些工具可以提升开发效率。...

    Ruby on Rails 学习案例

    10. **Gem包管理**:Ruby的Gem是类似Python的pip或Node.js的npm的包管理工具,Rails应用广泛依赖于Gems,如Devise用于身份验证,Pundit或CanCanCan用于权限管理,Carrierwave或Paperclip处理文件上传等。 11. **...

    mid.zip_Rails

    6. **Gemfile**:Rails项目通常使用Gems来管理依赖,Gemfile列出所有项目需要的外部库,如Devise(用户认证)、CanCanCan(权限控制)等,这在构建商业级应用时尤其重要。 7. **Assets**:Rails支持集中的静态资源...

    windows下配置netbeans开发rails

    9. **版本控制**:为了团队协作,你可能会用到Git或其他版本控制系统。NetBeans集成了Git,你可以直接在IDE中进行提交、拉取、合并等操作。 10. **持续集成**:对于大型项目,可以配置持续集成服务器,如Jenkins,...

    征服-Ruby On Rails.rar

    此外,Rails社区活跃,拥有大量的gem(相当于其他语言的库或插件),这些gem扩展了Rails的功能,例如Devise用于身份验证,CanCanCan用于授权管理,Pundit用于细粒度的权限控制,Paperclip或Carrierwave处理文件上传...

    Rails Best Practices

    5. **使用gem**:Rails社区有大量优秀的gem,如Devise用于用户认证,CanCanCan进行权限控制,Carrierwave或Paperclip处理上传等。合理选择和使用gem可以快速实现功能,同时注意版本管理和gem的更新。 6. **测试驱动...

    ruby on rails API

    这可以通过如Devise这样的库实现用户身份验证,而Pundit或CanCanCan则可用来处理权限控制。 8. 分页与过滤:为了提高性能和用户体验,API通常需要支持分页和过滤。Rails提供了`kaminari`或`will_paginate`等插件...

Global site tag (gtag.js) - Google Analytics