权限管理pundit

1. 原理

对应关系.png

Permission定义两个字段:action和resource。分别与Rails的Controller和Model对应。

Model关系定义

classUser

classRole

classPermission

定义权限

classApplicationPolicyclass<

在ApplicationPolicy里定义一个permit方法(类方法)用来定义和保存权限点,can?方法用来做权限检查。然后就可以像这样声明权限点:

classResourcePolicy

这些Action就会被保存到ResourcePolicy.actions里。

另外还需要两个方法policies和resource:

classApplicationPolicyclass<

分别用来获取所有的 Policy 和 每个 Policy 对应的 resource (这两个方法是通过简单的命名规则实现的, 灵活性会差一点).

2. 使用pundit

classApplicationController

添加验证

$ rails g pundit:install

生成默认的policy文件,路径为app/policies/application_policy.rb

将policies目录放到rails的自动加载路径中:config/application.rb

moduleBuildAnApiRailsDemoclassApplication

$ rails g pundit:policyuser

生成 app/policies/user_policy.rb为User模型进行权限验证。

classUserPolicy

如果users_controller有这么一段

defupdate@user=Article.find(params[:id])#这里验证current_user对这个@user是否有权限@user.update_attributes(user_attributes)end

我们给UserPolicy中添加一个方法,来验证这个用户是否有这个权限。

classUserPolicy

其中user和record来自于ApplicationPolicy。

然后在UsersController中添加验证

defupdate@user=User.find(params[:id])authorize@article,:[email protected]_attributes(user_attributes)end

由于action_name和验证方法的名字相同,可以简写

defupdate@user=User.find(params[:id])authorize@[email protected]_attributes(user_attributes)end

这是,我们已经进行了权限验证,当用户不具备权限的时候回抛出错误,不能不处理,需要捕获错误进行处理。

classApplicationController"You don't have permission to those resources."endend

3人点赞

Rails4笔记

你可能感兴趣的:(权限管理pundit)