您的位置:首页 > 大数据 > 人工智能

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 不适用,切忌
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐