- 浏览: 343535 次
- 性别:
- 来自: 蕲春->上海
-
文章分类
最新评论
-
duanyu010:
"Devel"选项 选项下包含了多个 gc ...
在cygwin中安装gcc编译器 -
brown802:
Event.observe('test', 'click',f ...
Prototype中的Event.observe用法 -
zhangyanan_it:
讲一下好吧!
Rails MD5 SHA1 加密用戶密碼 -
zhangyanan_it:
多谢!
Rails MD5 SHA1 加密用戶密碼 -
virusswb:
paperclip文件上传
在Rails中快速方便地使用Tiny mce编辑器
前几天,稍微分析了一下RBAC形式的权限管理系统的实现原理,然后我使用Rails做了一个。
先来说一下表间的关系:
users <--> roles roles <--> permissions
很简单,用户和角色是多对多关系,角色和权限也是多对多关系,那么关于权限管理这一块就一共有5张表。
具体的表结构:
还是直接看数据库定义文件吧!
在User这个Model中有以下两个关键的方法:
现在,大致的意思,相信应该说清楚了吧,我对于用户权限的验证就是根据url,准确地说,应该是根据controller名称和action名称来验证的。
那么现在来看看此权限管理系统是如何工作的吧!
在用户登录时,我把用户的id存到session范围中,然后在需要进行权限保护的控制器中加入如下的过滤器:
比如我在后台管理对文章进行管理(Admin::PostController),代码如下:
以上是对于每次请求的权限控制,那么在页面上如何根据登录用户的权限显示相应的权限内容呢?
在后台管理的模块页面中,加入如下的判断语句即可。
以上就是我做这个权限管理系统的基本思想,代码量比较少,思路也蛮请楚的,比较适合小型的项目。
不过我分析了一下这个权限管理系统,它就基于控制器和控制器方法的名称来判断的,而且应该是对使用generate scaffold形式生成的控制器能比较好地起作用。那么这就决定了它有多方面的不足。
1- 如何保护后台管理中的静态页面。
2- 使用不方便,在对permissions进行管理时,要求管理员比较对所用的程序比较熟悉,了解那些controller和action才行(我正在考虑怎么样让程序自动获取后台中的所有控制器和相关方法,并且显示它们的作用)
3- 权限重复比较多。
4- 与系统结合得感觉还是比较紧,我正在考虑如何运行ruby的特性将其变成一个插件(我的目标)
我正在考虑如何改进这些问题,从而做了一个轻量级的好用的权限管理系统。
不知道你说的是不是:
你是说对于某个特定的用户创建的资源的权限控制吗?我做的这个不能达到这个要求.
如果只有让B能看不能删posts,让C能看又能删posts,那可以通过我的这个控制.
不知道对于你说的针对某个特定的资源(在我我先暂且理解为table中的一条记录)是如何控制每个用户对其的权限控制,有什么好的方法没有??
我选用 RoleRequirement 这个插件,因为他支持eval一些自定义方法来进行细粒度的判断
经过修改,扩展出这种形式的调用:
@user.can_{action}_{controller}?
@user.can_{action}_{controller}?(@target)
以便在View能做更细致的布局
详细可参考以前写的测试例子:
http://www.iteye.com/post/409317
我现在头疼的也是这个,不光光基于角色,想把对资源的访问也统一控制,一直没有办法,现在都是分散在各个地方。不知道有谁有这方面的经验
不知道你说的是不是:
你是说对于某个特定的用户创建的资源的权限控制吗?我做的这个不能达到这个要求.
如果只有让B能看不能删posts,让C能看又能删posts,那可以通过我的这个控制.
不知道对于你说的针对某个特定的资源(在我我先暂且理解为table中的一条记录)是如何控制每个用户对其的权限控制,有什么好的方法没有??
说来听听呢!具体的是什么样子的呢?有什么优点?
例如人力资源部这个角色可以看到人力资源部的相关资源,财务部的角色可以看到财务部的相关资源,总经理工作部这个角色可以同时看到所有部门的资源,如果用3层结构,角色直接关联资源,那么关联总经理工作部资源的时候就会把人资部和财务部的资源再关联给总经部,会产生一些重复工作,当然也可以给总经部用户授予人资部和财务部的两个角色,不过这样并不是很直观,如果采用4层结构,财务部角色对应财务部权限,再对应财务部资源,总经部角色对应财务部权限加人资部权限,再对应相关资源,这样子可能会减少些赋权的工作量。
说来听听呢!具体的是什么样子的呢?有什么优点?
先来说一下表间的关系:
users <--> roles roles <--> permissions
很简单,用户和角色是多对多关系,角色和权限也是多对多关系,那么关于权限管理这一块就一共有5张表。
具体的表结构:
还是直接看数据库定义文件吧!
ActiveRecord::Schema.define(:version => 20080708074044) do create_table "permissions", :force => true do |t| t.string "name" t.string "action" t.datetime "created_at" t.datetime "updated_at" end create_table "permissions_roles", :id => false, :force => true do |t| t.integer "permission_id", :limit => 11 t.integer "role_id", :limit => 11 t.datetime "created_at" t.datetime "updated_at" end create_table "posts", :force => true do |t| t.string "title" t.text "body" t.datetime "created_at" t.datetime "updated_at" end create_table "roles", :force => true do |t| t.string "name" t.datetime "created_at" t.datetime "updated_at" end create_table "roles_users", :id => false, :force => true do |t| t.integer "role_id", :limit => 11 t.integer "user_id", :limit => 11 t.datetime "created_at" t.datetime "updated_at" end create_table "users", :force => true do |t| t.string "name" t.string "password" t.string "email" t.datetime "created_at" t.datetime "updated_at" end end
在User这个Model中有以下两个关键的方法:
#Get user's all permissions def permissions user_permissions = Array.new for role in self.roles user_permissions += role.permissions end user_permissions.uniq! user_permissions end #Get user's allowed requests uri def permission_urls user_urls = Array.new user_permissions = Array.new for role in self.roles user_permissions += role.permissions end for user_permission in user_permissions user_urls << user_permission.action end user_urls end
现在,大致的意思,相信应该说清楚了吧,我对于用户权限的验证就是根据url,准确地说,应该是根据controller名称和action名称来验证的。
那么现在来看看此权限管理系统是如何工作的吧!
在用户登录时,我把用户的id存到session范围中,然后在需要进行权限保护的控制器中加入如下的过滤器:
比如我在后台管理对文章进行管理(Admin::PostController),代码如下:
before_filter :authorize, :only => [:index, :show, :new, :edit, :destroy] def authorize unless User.find(session[:user_id]).permission_urls.include?( self.class.controller_path + "/" + self.action_name ) flash[:notice] = "You have not permission to do it!" redirect_to :controller => "admin/welcome" end end
以上是对于每次请求的权限控制,那么在页面上如何根据登录用户的权限显示相应的权限内容呢?
在后台管理的模块页面中,加入如下的判断语句即可。
<% if User.find(session[:user_id]).allowed_to?("admin/posts/index")%> <li id="posts_item"><%= link_to "Post Manage", admin_posts_path %></li> <% end %>
以上就是我做这个权限管理系统的基本思想,代码量比较少,思路也蛮请楚的,比较适合小型的项目。
不过我分析了一下这个权限管理系统,它就基于控制器和控制器方法的名称来判断的,而且应该是对使用generate scaffold形式生成的控制器能比较好地起作用。那么这就决定了它有多方面的不足。
1- 如何保护后台管理中的静态页面。
2- 使用不方便,在对permissions进行管理时,要求管理员比较对所用的程序比较熟悉,了解那些controller和action才行(我正在考虑怎么样让程序自动获取后台中的所有控制器和相关方法,并且显示它们的作用)
3- 权限重复比较多。
4- 与系统结合得感觉还是比较紧,我正在考虑如何运行ruby的特性将其变成一个插件(我的目标)
我正在考虑如何改进这些问题,从而做了一个轻量级的好用的权限管理系统。
评论
12 楼
kkito
2008-08-01
年初的时候我用了一个插件,感觉跟楼主这个差不多
activerbac
自己也思考了一下
至于那个控制粒度问题
你怎么控制粒度精确到对资源的操作?
如A建立的POSTS,B能看不能删,C是版主,能看有能删
我觉得也可以实现
应该除destory方法外还有一个destory_by_self方法
一般用户有destory_by_self的权限,而版主有destory权限
或者destory方法只能删除自己的文章,另一个admin_destory可以随便删
就能做到自己的能够删,不能删别人,版主都能删文章的功能
本来逻辑上就可以看成两码事
activerbac
自己也思考了一下
至于那个控制粒度问题
你怎么控制粒度精确到对资源的操作?
如A建立的POSTS,B能看不能删,C是版主,能看有能删
我觉得也可以实现
应该除destory方法外还有一个destory_by_self方法
一般用户有destory_by_self的权限,而版主有destory权限
或者destory方法只能删除自己的文章,另一个admin_destory可以随便删
就能做到自己的能够删,不能删别人,版主都能删文章的功能
本来逻辑上就可以看成两码事
11 楼
lurena
2008-08-01
这个基本没有实用性, 实现的权限管理要比这复杂得多.
做教科书还可以.
做教科书还可以.
10 楼
rainchen
2008-08-01
qichunren 写道
引用
你怎么控制粒度精确到对资源的操作?
如A建立的POSTS,B能看不能删,C是版主,能看有能删
如A建立的POSTS,B能看不能删,C是版主,能看有能删
不知道你说的是不是:
你是说对于某个特定的用户创建的资源的权限控制吗?我做的这个不能达到这个要求.
如果只有让B能看不能删posts,让C能看又能删posts,那可以通过我的这个控制.
不知道对于你说的针对某个特定的资源(在我我先暂且理解为table中的一条记录)是如何控制每个用户对其的权限控制,有什么好的方法没有??
我选用 RoleRequirement 这个插件,因为他支持eval一些自定义方法来进行细粒度的判断
class Admin::Listings < ApplicationController require_role "contractor" require_role "admin", :for => :destroy # don't allow contractors to destroy # leverage ruby to prevent contractors from updating listings they don't have access to. require_role "admin", :for => :update, [b]:unless => "current_user.authorized_for_listing?(params[:id]) "[/b] ... end "
经过修改,扩展出这种形式的调用:
@user.can_{action}_{controller}?
@user.can_{action}_{controller}?(@target)
以便在View能做更细致的布局
详细可参考以前写的测试例子:
http://www.iteye.com/post/409317
9 楼
reeze
2008-07-31
现在也很头疼这个问题。。要这针对某个资源进行访问控制。普通的基于权限的方式不是记恨有效。比如一个群组,可以设置访问权限,然后管理员 ,组成员,非组员的控制很不DRY,也很分散。。不知道有没有比较灵活的解决办法~
8 楼
universac
2008-07-29
rainchen 写道
你怎么控制粒度精确到对资源的操作?
如A建立的POSTS,B能看不能删,C是版主,能看有能删
如A建立的POSTS,B能看不能删,C是版主,能看有能删
我现在头疼的也是这个,不光光基于角色,想把对资源的访问也统一控制,一直没有办法,现在都是分散在各个地方。不知道有谁有这方面的经验
7 楼
qichunren
2008-07-29
引用
你怎么控制粒度精确到对资源的操作?
如A建立的POSTS,B能看不能删,C是版主,能看有能删
如A建立的POSTS,B能看不能删,C是版主,能看有能删
不知道你说的是不是:
你是说对于某个特定的用户创建的资源的权限控制吗?我做的这个不能达到这个要求.
如果只有让B能看不能删posts,让C能看又能删posts,那可以通过我的这个控制.
不知道对于你说的针对某个特定的资源(在我我先暂且理解为table中的一条记录)是如何控制每个用户对其的权限控制,有什么好的方法没有??
6 楼
rainchen
2008-07-17
你怎么控制粒度精确到对资源的操作?
如A建立的POSTS,B能看不能删,C是版主,能看有能删
如A建立的POSTS,B能看不能删,C是版主,能看有能删
5 楼
phoenix520
2008-07-17
qichunren 写道
phoenix520 写道
这个是用户角色资源的3层结构?我们现在使用的是用户角色权限资源的4层结构,但很多时候觉得多了那么一层,哪种结构更加合理一点呢?
说来听听呢!具体的是什么样子的呢?有什么优点?
例如人力资源部这个角色可以看到人力资源部的相关资源,财务部的角色可以看到财务部的相关资源,总经理工作部这个角色可以同时看到所有部门的资源,如果用3层结构,角色直接关联资源,那么关联总经理工作部资源的时候就会把人资部和财务部的资源再关联给总经部,会产生一些重复工作,当然也可以给总经部用户授予人资部和财务部的两个角色,不过这样并不是很直观,如果采用4层结构,财务部角色对应财务部权限,再对应财务部资源,总经部角色对应财务部权限加人资部权限,再对应相关资源,这样子可能会减少些赋权的工作量。
4 楼
qichunren
2008-07-16
phoenix520 写道
这个是用户角色资源的3层结构?我们现在使用的是用户角色权限资源的4层结构,但很多时候觉得多了那么一层,哪种结构更加合理一点呢?
说来听听呢!具体的是什么样子的呢?有什么优点?
3 楼
superxielei
2008-07-16
我现在使用的是三层的,并没有权限这一层,这个应该是不同的项目有不同的需求吧。
应该是四层的更完善一点,但应该是可以配置的。
应该是四层的更完善一点,但应该是可以配置的。
2 楼
phoenix520
2008-07-16
这个是用户角色资源的3层结构?我们现在使用的是用户角色权限资源的4层结构,但很多时候觉得多了那么一层,哪种结构更加合理一点呢?
1 楼
superxielei
2008-07-16
说错了。还是删了吧!!
发表评论
-
使用Ruby Encoder加密Ruby代码
2012-02-27 13:56 2444Use Rubyencoder Encrypt Ruby ... -
解决oracle-enhancedk中的一个bug
2010-12-06 09:57 0usermatoMacBook-Pro:jjsc_web_ba ... -
mac osx上安装rmagick
2010-10-25 12:03 4299本来以为安装这个超级麻烦,我那时是想从源码编译安装,后来找到p ... -
dduuuuuuu
2010-10-20 21:02 0说说rspec2 rspec2 前不久出来了,它 ... -
最新版本的gcc编译安装fcgi出错的解决办法
2010-03-06 17:43 10328最近在折腾vps,在上面步骤ROR应用,部署方案还是用我倾向的 ... -
来自O’Reilly出版社的《Ruby Best Practices》
2010-03-04 17:40 1800我在rubyinside网站上看到了《Ruby Best Pr ... -
手机版网站开发(1)
2010-01-25 18:16 0要开始着手这方面的事情了,所以通些这段时间的调研,发现要关注的 ... -
在Ruby中调用存储过程
2010-01-23 10:57 0在pl/sql developer里 Connected t ... -
Rails2.0.2中rake在production环境不能log
2010-01-22 15:14 1339目前的定时任务是用cron + rake。 在rake中使用 ... -
Will_paginate支持分页和排序的多条件查询
2009-12-28 11:09 0Logistic Model # 支持分页和排序的多条件查 ... -
Rails生成HTML
2009-12-28 10:59 1820在Rails中生成HTML一般有现在的Page Cache,不 ... -
Ruby中处理Excel
2009-12-19 14:23 1256发现了一个很不错的解决方案: 这里是它的GUIDE http: ... -
在Rails中的 Model中使用current_user
2009-12-19 12:31 4744在Rails中的 Model(业务层)中使用current_u ... -
在Ruby中处理压缩文件
2009-12-18 18:39 1102http://rubyzip.sourceforge.net/ ... -
火星高楼抢楼机器人
2009-08-05 14:15 13562009-8-14下午JavaEye登录更新了,加了图片验证码 ... -
Rails中使用好named_scope与时间区间
2009-07-18 00:56 2515在我最近的工作中,由于要做数据统计,与时间区间打交道非常多,如 ... -
Ruby中的类方法与实例方法
2009-06-28 18:12 3137原文:http://railstips.org/2 ... -
Rails社区对Rails3特性的讨论和反馈
2009-05-31 21:29 2402Rails官方博客写道他们在UserVoice上建立了一个讨论 ... -
为非Restful的action准备的插件:static_actions
2009-05-30 10:06 1337如果我们的Rails应用里能够全部Restful,那很cool ... -
Ruby游戏开发利器Gosu
2009-05-16 18:46 3165在2009年的Railsconf大会上,Hongli Lai和 ...
相关推荐
综上所述,基于Grails的财政项目是一个集成了EasyUI前端框架的Web管理系统,具备权限管理功能,通过合理的架构设计和插件支持,实现了高效、安全的财政管理服务。开发者可以深入研究其源代码,学习Grails框架的使用...
4. **权限管理**:企业级应用通常需要严谨的权限控制,以确保数据安全。学习这部分源码,我们可以理解RBAC(Role-Based Access Control)模型是如何实现的,以及如何进行用户、角色、权限的关联。 5. **任务调度**...
4. **用户认证与权限**:为了确保每个用户只能查看和编辑自己的日记,系统需要实现用户认证机制,如OAuth2或JWT(JSON Web Tokens),以及权限控制,如RBAC(Role-Based Access Control)。 5. **安全性**:考虑到...
金丝雀(Canary)是Elixir编程语言中一个用于构建插件应用程序的授权和资源加载库,尤其在处理Web应用程序时,它为Phoenix框架提供了强大的安全控制和资源管理功能。Elixir是一种函数式、并发性和面向消息的编程语言...
5. **权限管理**:控制不同用户对内容的访问和编辑权限,如角色基础访问控制(RBAC)。 6. **API接口**:提供与其他服务或应用的数据交换能力,通常采用RESTful API设计。 7. **部署与运维工具**:包括版本控制...