set*_*thi 1 ruby-on-rails ruby-on-rails-4 pundit
我正在学习使用Pundit进行授权。但是我看到的是资源授权而不是页面授权。如果用户无权使用pundit访问该页面,我希望将其重定向到未经授权的页面。
例如
class OnlyAdminCanVisitController < ApplicationController
before_filter :admin_authenticate
Run Code Online (Sandbox Code Playgroud)
停止非管理员角色的用户。
另外,我想处理如下的组合方案(考虑到有Admin,Manager,Employee,Outsider等4个角色。下面的设计显然很糟糕)
class AdminManagerCanVisitController < ApplicationController
before_filter :admin_or_manager_authenticate
class AdminEmployeeCanVisitController < ApplicationController
before_filter :admin_or_employee_authenticate
class AdminOutsiderCanVisitController < ApplicationController
before_filter :admin_or_outsider_authenticate
class AdminManagerEmployeeCanVisitController < ApplicationController
before_filter :admin_or_manager_employee_authenticate
Run Code Online (Sandbox Code Playgroud)
我有4个角色,并且想为这些控制器编写允许任意组合授权的权威策略。
让我知道专家是否旨在解决这个问题。
谢谢
实际上,页面和资源之间没有太大区别。因此,您可以通过以下方式解决您的问题application_controller.rb:
class ApplicationController < ActionController::Base
include Pundit
rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized
protected
def admin_authenticate
authorize current_user, :admin?
end
private
def user_not_authorized(exception)
# Redirect to whatever page you want if not authorized
end
end
Run Code Online (Sandbox Code Playgroud)
然后,您需要定义策略。我通常admin?在application_policy.rb(https://github.com/elabs/pundit#policies)中创建一个方法,因此该方法也将散布在我的其他策略中:
class ApplicationPolicy
def admin?
# Logic to ensure the user is an admin
end
end
class UserPolicy < ApplicationPolicy
end
Run Code Online (Sandbox Code Playgroud)
然后在您的其他控制器中,就像您所做的那样:
class OnlyAdminCanVisitController < ApplicationController
before_action :admin_authenticate
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1314 次 |
| 最近记录: |