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

Rails2 的授权认证

阅读更多

用了Rails2 以后,所有的东西都要去寻求插件帮助了, 在网上找了篇文章,好像还是挺有用的。我在本地使用act_as_authenticated 插件和Role_requirement插件还是配置成功了的

 

关键词: authorization(授权认证) authentication(登录认证) role based authorization Role Requirement Role Based Access Control (RBAC)

相关链接:
http://anonymouse.org/cgi-bin/anon-www.cgi/http://www.bencurtis.com/archives/2007/06/user-roles-in-rails-applications/
http://wiki.rubyonrails.com/rails/pages/Authentication+and+Security+Plugins
http://code.google.com/p/rolerequirement/
http://active-rbac.rubyforge.org/
http://wiki.rubyonrails.org/rails/pages/ActiveRBAC
http://active-rbac.rubyforge.org/
http://rubyforge.org/projects/activeacl/
http://www.billkatz.com/authorization(Authorization Plugin 详解)
http://railsforum.com/viewtopic.php?pid=2329
http://agilewebdevelopment.com/plugins/search?search=role
http://blog.wolfman.com/articles/2006/05/20/role-based-authentication-admin-page
http://www.writertopia.com/developers/authorization (Authorization Plugin 使用说明 Version 1.0 (Sept 13, 2006))
http://technoweenie.stikipad.com/plugins/show/Acts+as+Authenticated

other tips:

(较长,略)


my tips:

ActiveRBAC :
太复杂,要建立9个表!

Authorization plugin:
可配合已有登录系统使用,但需要登录系统提供一个current_user 方法(取当前已登录的用户对象)作为接口(可在ApplicationController中自定义)
每个角色需要建立一个表?from http://www.billkatz.com/authorization
语法怪异,但功能比较丰富
支持:only,:except等选项。
支持无数据库调用hardwired模式(AUTHORIZATION_MIXIN='hardwired')
支持acts_as_authorizable as well as acts_as_authorized_user:
user.has_role? 'member', Group
支持单表继承来实现多态
先在controller中设置基本权限,然后在每个action里细分权限:
class MeetingController < ActionController::Base
    permit "registered", :except => :public

    def public
      # Anybody can access this action
    end
  
    def list
      # Any "registered" user can access this action.
      ...
    end
  
    def add_item
      # Only moderators of this meeting or a user who is an admin can add items.
      permit "moderator of :meeting or admin", :meeting => Meeting.find(params[:id]) do
        ...
      end
    end

    def edit
      # Editing is limited to the admin of this meeting or users who have a global admin role.
      @meeting = Meeting.find(params[:id])
      if permit? "(admin of :meeting) or admin"    # Note that no :meeting hash is provided, so @meeting is used.
        # Do editing
      end
    end

    protected
    # 非公开action的保护方法
    def remove_moderator
      # 只允许 对象所有者 或者 管理员
      permit "admin of :meeting or admin"
      ...# do remove process
      # 删除对象后 移除 对象权限的关联
      permit_set "not moderator of :meeting", :user => @removed_member
    end
end

The difference between permit and permit? is redirection. permit redirects by default. permit? can be used within expressions and does not redirect by default.


User engine :
配置复杂,而功能却简单,只做到controller/action级别的限制,但有不错的view helper方法,如 link_if_authorized(controller, action),authorized?(controller, action)


RoleRequirement :
http://code.google.com/p/rolerequirement/
需先安装acts_as_authenticated 插件,(会覆盖掉unknown action)
添加两个表:roles和users_roles (通过生成器生成,名字可配置),
可建立role 或roles 两种不同关联(has_one :role 或has_many :roles),roles可以配置为enum column
权限直接在controller里设置(应该可扩展出把权限保存到数据库了,读出时覆盖controller里的默认设置),
有has_role?('admin')的辅助方法,
核心方法(controller instance method)user_authorized_for?(user_object, params = {:controller=>"user", :action=>"edit"})
view的辅助方法有:url_options_authenticate?({:controller=>"user", :action=>"edit"})
可扩展出@user.authorized_for?("/user/edit") (再尝试扩展出动态方法:@user.can_{action}_{controller}? )
似乎可扩展出object级别的限制(Business Object Permissions ):require_role "admin", :only => :update, :unless => "current_user.authorized_for_listing?(params[:id]) "
用法类似before_filter,可添加only和except来指定排除:
#   * :only - Only require the role for the given actions
#   * :except - Require the role for everything but
#   * :if - a Proc or a string to evaluate.   If it evaluates to true, the role is required.
#   * :unless - The inverse of :if

class Admin::Listings < ApplicationController
   require_role "contractor"
   require_role "admin", :only => :destroy # don't allow contractors to destroy
end

步骤:
1.分别安装acts_as_authenticated rolerequirement
# rolerequirement的用法在README,在线的wiki没用
2.用acts_as_authenticated的generator生成user model和user controller:
#script/generate authenticated UserModelName UserControllerName
script/generate authenticated user users
(rolerequirement需要一个current_user方法做接口,如果上面生成的UserModelName不是"user",如是"person",则需要在ApplicationController里alias一个同名方法,如 alias :current_user :current_person)
# UsersController 会添加4个action: index login signup logout

#2.2 执行rake db:migrate
3.用rolerequirement的generator生成role model(留意生成完后有提示,会修改user model及ApplicationController的代码 http://code.google.com/p/rolerequirement/wiki/WhatTheGeneratorsDo):
#script/generate roles RoleModelName UserModelName
script/generate roles role user
#3.2 执行rake db:migrate
4.添加权限限制到controller中
class RolesController < ApplicationController
   scaffold :role
   require_role "admin"
end
5.在console里添加一个role到user
user = User.find(:first)
role = Role.find_or_create_by_name "admin"
user.roles << role unless user.roles.any?{ |r| r.name == role.name }
# 默认在User model里的has_role?方法总是返回true,如果user里有'admin' role


Active Acl:
基于 phpgacl的设计;使用polymorphic(因此需要安装has_many_polymorphs 插件) 做关联(一般都是用habtm)。封装了网状查询,只用一条SQL就能得到所有的权限数据;调用方法: current_user.has_permission?(User::LOGIN) and object level (3D, like admin.has_permission?(Forum::ADMIN, :on => team_forum)) ,设置太复杂

ACL System:
http://agilewebdevelopment.com/plugins/acl_system
可配合已有的登录系统使用,需要current_user 方法作为接口(若要改变则要hack源码),需要一个role model,且有个title属性(若要改变则要hack源码),并在user中设置habtm联系,代码也很简单。(评分挺高 Rating: 4/5 (42 votes))
没有user.has_role?('admin')这样的辅助方法
不支持直接判断controller和action,如 user.can_access?(controller, action)

需添加两个表:roles和roles_users(注意表名),权限直接在controller里设置,主要是access_control,但还要显式的与before_filter :login_required配合使用,比较麻烦:
class PostController < ApplicationController
   before_filter :login_required, :except => [:list, :index]
   access_control [:new, :create, :update, :edit] => '(admin | user | moderator)',
                  :delete => 'admin & (!moderator & !blacklist)'
end

class PostController < ApplicationController
   before_filter :login_required, :except => [:list, :index]
   access_control :DEFAULT => '!guest' ,
                  [:new, :create, :update, :edit] => '(admin | user | moderator)',
                  :delete => 'admin & (!moderator & !blacklist)'
end

在view中用法:
<% restrict_to "(admin | moderator) & !blacklist" do %>
   <%= link_to "Admin & Moderator only link", :action =>'foo' %>
<% end %>

<% if permit? "(admin | moderator) & !blacklist" %>
you can ...
<% else %>
you can't ...
<% end %>


access_control :
使用较麻烦,用法类似linux的权限控制(rwx),让人迷糊,部分功能未完成:
class AdminController < ApplicationController
   authorize "admin:rw"
   authorize "admin:x", :only => :special_action
  
   def index
     ...
   end

   def special_action
     ...
   end
end

 

最后选择了RoleRequirement,并扩展实现了:
@user.can_{action}_{controller}?

如:
@user.can_edit_post?

下一步:model security,如:
@user.can_edit_post?(@post)

分享到:
评论

相关推荐

    Rails项目源代码

    "Sign"可能是项目的登录或注册模块,它涉及用户认证和授权。在Rails中,可以使用Devise这样的gem来处理用户身份验证,提供注册、登录、密码重置等功能。用户模型通常会包含确认令牌、加密密码等相关字段。 4. **...

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

    4. **实现认证和授权机制**:为了保证API的安全性,需要实现用户认证和权限管理功能,例如使用JWT(JSON Web Tokens)、OAuth等方式。 5. **错误处理**:定义一套统一的错误处理策略,当请求无法正确处理时能够向...

    ruby on rails最新版

    例如,Devise用于用户认证,CanCanCan用于授权管理,Paperclip或Carrierwave处理文件上传,Stripe或PayPal集成支付功能,以及各种数据分析和报表生成库等。 总的来说,这个压缩包对于Ruby on Rails的初学者或希望...

    ruby on rails 3 tutorial.pdf

    例如,Devise用于用户认证,CanCanCan用于授权管理,Paperclip或Carrierwave处理文件上传等。 此外,本书还会介绍Rails的安全实践,包括防止SQL注入、XSS攻击等常见Web安全问题。你将学习如何使用strong parameters...

    Agile+Web+Development+with+Rails中文版.pdf

    书中会讲解如何利用这些工具进行数据库操作、表单处理、认证与授权,以及如何与其他服务和API集成。 此外,《Agile Web Development with Rails》还涵盖了测试驱动开发(TDD)和行为驱动开发(BDD)。TDD强调先写...

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

    在Rails应用中,用户认证和授权是常见的需求,用于保护应用资源的安全。"http_authentication"和"restful-authentication"是两个早期的Rails登录和验证插件,它们为Rails应用提供了基本的身份验证功能。 HTTP基本...

    ruby on rails社区网站开发源码

    13. **社区插件(Gems)**:Rails的生态系统中有大量高质量的第三方Gem,如Devise(用户认证)、Pundit(授权管理)、Paperclip或Carrierwave(文件上传)等,它们可以极大地扩展Rails的功能。 通过研究这个源码,...

    Rails3+GithubOAuth2+设计示例应用程序_Ruby_JavaScript_下.zip

    标题 "Rails3+GithubOAuth2+设计示例应用程序" 提供了我们正在处理一个使用Rails 3框架构建的Web应用程序,该应用集成了Github的OAuth2授权机制。Rails是Ruby on Rails的简称,是一个流行的开源Web开发框架,以其DRY...

    InspiniaAdmin 2.6.1 Rails_Full_Version

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

    应用Rails进行敏捷Web开发中文第三版

    6. **插件和gem**:Rails社区有大量的插件和gem可供扩展功能,如Devise用于用户认证,Cancancan用于授权,或者Paperclip和Carrierwave处理文件上传。 7. **Ajax和JavaScript**:Rails 2.2.2支持集成Prototype ...

    Rails 3 in Action

    - 令牌认证(token authentication)。 - 外部服务集成,如 OAuth。 #### 七、文件上传 第九章讨论了 **文件上传** 的实现方式,这是 Web 应用中常见的功能之一。 - **文件上传**: - 实现用户可以上传图片、文档...

    ruby on rails 书全集(10余本经典著作PDF版)

    在实战篇中,读者可以学习如何构建实际的Web应用程序,包括用户认证、授权、会话管理、RESTful API设计、前端集成如使用Bootstrap或Vue.js等。此外,可能会涉及到Rails与其他服务的集成,如使用OAuth进行第三方登录...

    Rails3 device and cancan

    标题《Rails3 device and cancan》与描述《ROR ruby on rails device plugin教程》指出本文是关于如何在Rails 3.2应用程序中整合Devise认证插件和Cancan授权插件的教程。Devise是一个流行的Ruby on Rails的认证解决...

    angle-admin-v3.5.1(rails版)

    此外,Angle-admin可能包含了用户认证和授权的解决方案,如Devise或CanCanCan,确保只有授权用户才能访问特定资源。 10. **测试**:Rails鼓励TDD(Test-Driven Development)和BDD(Behavior-Driven Development)...

    ruby on rails API

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

    Rails.Recipes.Rails.3rd和源码

    10. **社区工具和插件**:介绍一些常用的Rails gem,如Devise用于用户认证,Paperclip或Carrierwave处理文件上传等。 附带的`rr2-code.zip`文件很可能包含了书中各章节示例代码,这将有助于读者更好地理解和实践书...

    Beginning.Rails.3

    - **安全性**:探讨如何确保应用的安全性,包括认证、授权和输入验证。 - **部署和生产环境配置**:提供部署Rails应用的最佳实践,以及如何在生产环境中优化性能。 - **高级主题**:涉及一些进阶的话题,如性能调优...

    Ruby-Knock为RailsAPI实现无缝JWT身份验证

    Rails是构建Web应用程序的利器,它提供了许多内置的功能来简化开发过程,包括身份验证和授权。在描述中提到的"Knock"是一个专门为Rails API设计的库,它帮助开发者实现JSON Web Token(JWT)的身份验证,这是一种...

Global site tag (gtag.js) - Google Analytics