rails3 中新用户注册、普通用户修改资料、管理员管理用户资料 权限之model 继承实现
2012-05-05 13:52
615 查看
rails3 中新用户注册、普通用户修改资料、管理员管理用户资料 权限之model 继承实现
2
次投票
vkill 分享于
大约一年 前, 0
条回复, 1366
次浏览
More
Sharing ServicesShare|Share
on facebookShare
on myspaceShare
on googleShare
on twitterShare
on baiduShare
on digg
需求分析: 一般情况下我们User表中的基本字段如下: nickname email_address salt crypted_password is_active is_admin 其中salt crypted_password 为model内部赋值,不对外提供访问权限 那么这里使用了salt加密密码,自然得有个虚拟字段 password 还有普通用户修改密码时也需要验证原始密码,自然得有个虚拟字段 old_password
rails3 中新用户注册、普通用户修改资料、管理员管理用户资料 权限之model 继承实现
需求分析:
一般情况下我们User表中的基本字段如下:
nickname email_address salt crypted_password is_active is_admin
其中salt crypted_password 为model内部赋值,不对外提供访问权限
那么这里使用了salt加密密码,自然得有个虚拟字段 password
还有普通用户修改密码时也需要验证原始密码,自然得有个虚拟字段 old_password
目标:
1、新用户注册的时候只能修改 昵称、密码、邮箱 ,即得有 nickname email_address password 字段的修改权限
2、普通用户修改资料时首先得提供原始密码,那么就得有 old_password 字段的修改权限
普通用户只能修改邮箱,那么就得有 email_address 字段的修改权限,新用户本身已经有这个字段的修改权限,固只需要继承就好
普通用户修改修改密码得验证原始密码,修改密码一般都是单独设置页面,单独 u.password=xx 这样,所以这里也禁止访问 password 字段
普通用户不能修改昵称,那么就不能有 nickname 字段的修改权限
3、管理员管理用户资料时可没有任何限制,且不需要提供原始密码,总结上面两点后发现,我们在继承新用户后再加上 is_active is_admin 这两个字段的访问权限就好
实现:
一、
[root@vkill-arch ~]# rails -v Rails 3.0.3 [root@vkill-arch ~]# rails new aaa && cd aaa [root@vkill-arch aaa]# rails g model user nickname:string email_address:string salt:string crypted_password:string is_active:boolean is_admin:boolean [root@vkill-arch aaa]# rake db:migrate
改个名字,等生成完scaffold 后再改回来
[root@vkill-arch aaa]# mv db/migrate/20110324130836_create_users.rb db/migrate/20110324130836_create_users.rb_init
加入虚拟字段,这样所需要的字段就都齐了
[root@vkill-arch aaa]# cat app/models/user.rb class User < ActiveRecord::Base attr_accessor :password, :old_password end
二、
生成新用户注册页面,提示你 Overwrite /root/aaa/app/models/user.rb? (enter “h” for help) Ynaqdh 时选n
注:只留下 new 和 create 就可以了
root@vkill-arch
aaa# rails g scaffold user nickname:string email_address:string password:string
生成普通用户修改资料的页面
注:只留下 edit 和 update 就可以了
[root@vkill-arch aaa]# rails g scaffold profile::user old_password:string nickname:string email_address:string password:string
修改 admin/profile.rb 如下,因为要继承User model,当然也要用一个表了
[root@vkill-arch aaa]# cat app/models/profile/user.rb class Profile::User < User set_table_name "users" end
生成管理员修改用户资料的页面
[root@vkill-arch aaa]# rails g scaffold admin::user nickname:string email_address:string password:string is_active:boolean is_admin:boolean
修改 admin/user.rb 如下,道理同上
[root@vkill-arch aaa]# cat app/models/admin/user.rb class Admin::User < User set_table_name "users" end
把scaffold生成的migration删掉,把model生成的migration改名回来
[root@vkill-arch aaa]# find db/migrate/ -name '*_users.rb'|xargs rm [root@vkill-arch aaa]# mv db/migrate/20110324130836_create_users.rb_init db/migrate/20110324130836_create_users.rb
三、
现在开始设置权限
[root@vkill-arch aaa]# cat app/models/user.rb class User < ActiveRecord::Base attr_accessor :password, :old_password attr_accessible :nickname, :email_address, :password end [root@vkill-arch aaa]# cat app/models/profile/user.rb class Profile::User < User set_table_name "users" attr_protected :nickname attr_protected :password #这里这样设置是要用户修改密码走单独的修改页面,在c中直接 u=User.find(2);u.password='xx' attr_accessible :old_password #这里一定要注意 attr_protected 和 attr_accessible 的顺序,不难颠倒 end [root@vkill-arch aaa]# cat app/models/admin/user.rb class Admin::User < User attr_accessible :is_valid, :is_admin end
四、 测试
irb(main):002:0> u = User.new({:nickname=>'a',:email_address=>'b',:password=>'123',:is_admin=>true}) => #<User id: nil, nickname: "a", email_address: "b", salt: nil, crypted_password: nil, is_active: nil, is_admin: nil, created_at: nil, updated_at: nil> irb(main):003:0> u.save => true
这里可以看到新用户注册的时候 is_admin 是没有被改成 true 的
irb(main):019:0> u=Profile::User.find(1) => #<Profile::User id: 1, nickname: "a", email_address: "b", salt: nil, crypted_password: nil, is_active: nil, is_admin: nil, created_at: "2011-03-24 13:42:26", updated_at: "2011-03-24 13:56:16"> irb(main):020:0> u.update_attributes({:nickname=>'aa',:email_address=>'bb',:is_admin=>true}) => true irb(main):021:0> u => #<Profile::User id: 1, nickname: "a", email_address: "bb", salt: nil, crypted_password: nil, is_active: nil, is_admin: nil, created_at: "2011-03-24 13:42:26", updated_at: "2011-03-24 13:56:39">
这里可以看到普通用户修改email_address成功,但是修改 nickname 和 is_admin 都不成功
irb(main):022:0> u=Admin::User.find(1) => #<Admin::User id: 1, nickname: "a", email_address: "bb", salt: nil, crypted_password: nil, is_active: nil, is_admin: nil, created_at: "2011-03-24 13:42:26", updated_at: "2011-03-24 13:56:39"> irb(main):023:0> u.update_attributes({:nickname=>'aaa',:email_address=>'bbb',:is_admin=>true}) => true irb(main):024:0> u => #<Admin::User id: 1, nickname: "aaa", email_address: "bbb", salt: nil, crypted_password: nil, is_active: nil, is_admin: true, created_at: "2011-03-24 13:42:26", updated_at: "2011-03-24 13:58:08">
这里可以看出admin不受限制
好了,收工,基本上model的权限继承大概就这样,至于controller 和 view 的一些用不到的都可以删除啦
当然,这样做还有一个很大的好处就是生成的 c 和 v 都直接可以用,不用再去修改路由helper
我们把像salt密码的这些了都可以写入到 User 中,Profile::User 和 Admin::User 就可以再不用写任何东西了,只需要写那两三句权限设置就好了
最后一定要注意,此方法仅适用于 rails3 ,rails2 不适用,切忌
相关文章推荐
- 银行管理系统 实现用户注册 登录 存、取款 交易记录查询和修改用户信息等功能
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(19)-用户信息的修改和浏览
- AD域环境下利用Supercrypt实现普通用户安装/运行/更新使用管理权限的方法
- 【AD】AD域环境下利用Supercrypt实现普通用户安装/运行/更新使用管理权限的方法
- 普通用户的注册和管理员的权限操作
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(16)-类库架构扩展以及DLL文件生成修改和用户的简单添加
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(17)-注册用户功能的细节处理(各种验证)
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(17)-注册用户功能的细节处理(各种验证)
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(16)-类库架构扩展以及DLL文件生成修改和用户的简单添加
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(19)-用户信息的修改和浏览
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(17)-注册用户功能的细节处理(各种验证)
- SpringAOP实现的用户权限管理【修改了别人的代码,感谢原作者!】
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(19)-用户信息的修改和浏览
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(16)-类库架构扩展以及DLL文件生成修改和用户的简单添加
- AD域环境下利用Supercrypt实现普通用户安装/运行/更新使用管理权限的方法
- 实现业务系统中的用户权限管理--设计篇
- 普通用户运行管理员权限方法
- 实现业务系统中的用户权限管理--实现篇
- 实现业务系统中的用户权限管理--设计篇
- 实现业务系统中的用户权限管理--实现篇