Angenommen, ich habe ein Szenario, in dem wir haben Users
und jeder Benutzer kann ihre eigenen Projects
erstellen.Pundit Scoping Verwendung leer Ergebnisse
Ich versuche die Aktion meines Rails-Controllers zu beschränken, um nur dem Administrator oder dem Besitzer des Projekts zu erlauben, durch die Show
Aktion gehen zu können.
Das Problem, dem ich gegenüberstehe, ist vielleicht, dass ich Missverständnis darüber habe, wie man Scopes in Pundit benutzt.
Meine Show
Aktion sieht wie folgt aus:
def show
project = policy_scope(Project).find_by({id: project_params[:id]})
if project
render json: project
else
render json: { error: "Not found" }, status: :not_found
end
end
sieht My Pundit Scope Klasse wie folgt:
class Scope < Scope
def resolve
if @user.admin?
scope.all
else
# obviously, if non-matching user id, an ActiveRelation of
# empty array would be returned and subsequent find_by(...)
# would fail causing my controller's 'else' to execute
# returning 404 instead of 403
scope.where(user_id: @user.id)
end
end
end
In meinem Rails-Test, ich sollte, dass nicht-Projektinhaber geltend zu machen versuche erhalten a 403 verboten:
test "show project should return forbidden if non admin viewing other user's project" do
# "rex" here is not the owner of the project
get project_path(@project.id), headers: @rex_authorization_header
assert_response :forbidden
end
Mein Test schlägt fehl. Ich erhalte den Fehler:
Failure:
ProjectsControllerTest#test_show_project_should_return_forbidden_if_non_admin_viewing_other_user's_project [/Users/zhang/App_Projects/LanceKit/Rails_Project/LanceKit/test/controllers/projects_controller_test.rb:40]:
Expected response to be a <403: forbidden>, but was a <404: Not Found>.
Expected: 403
Actual: 404
Ich fühle mich nicht wie ich Pundit richtig verwende.
Sollte ich Pundit authorize project
statt policy_scope(Project)...
für die Show
Aktion verwenden?
Ich erwartete, dass die scope.where(...)
die falsche Benutzer-ID erkennen und einen Fehler zurücksenden, der besagt "Sie sind nicht berechtigt, diese Ressource anzuzeigen", anstatt Ergebnisse zurückzuliefern.
Ich fand auch diese Stackoverflow-Post: http://StackOverflow.com/Questions/21172620/Why-are-Scope-orientierte -Aktionen-insbesondere-Index-Aktionen-behandelte-Differen Die Antwort von Rob scheint vorzuschlagen, den Anwendungsbereich zu verwenden für Index-/Show-Aktionen. – Zhang