권한을 강제하는 가장 좋은 방법은 무엇인가요? 컨트롤러인지 제약 조건인지?

server 모델을 추가하는 플러그인을 하나 작성했습니다. 이 모델에는 user_id 필드가 있습니다. 저는 server의 소유자만 POST 요청을(아니면 PUT이어야 할까요? — 이 동작은 사용자의 서버에서 Discourse 인스턴스를 커맨드 라인으로 재빌드합니다. 어떤 것이 베스트 프랙티스인지 확실하지 않습니다.) 수행할 수 있도록 하고 싶습니다.

config/routes.rb에는 다음과 같은 코드가 있습니다:

post “/upgrade/:id” => “servers#queue_upgrade”, constraints: PfaffmanagerConstraint.new

pfaffmanager_constraint.rb의 matches?에서 path_parameters[:action]를 확인하고在那里 권한을 강제하는 것이 권장되나요, 아니면 servers_controller.rb에서 수행하는 것이 좋나요?

또한, 이 라우트를 namespace :user 아래로 이동하는 것이 실제로 해야 할 일이라고 생각합니다. 그래서 그 부분을 파악하면 이 문제도 자연스럽게 해결될 수 있을 것 같지만, 현재는 거의 작동하고 있으며 다른 사람들이 이 코드를 시도해 볼 수 있도록 하고 싶습니다.

Rails 라우트는 다음과 같습니다:
https://github.com/pfaffman/discourse-pfaffmanager/blob/master/config/routes.rb#L12

그리고 제 컨트롤러는 권한을 강제하려고 시도하고 있습니다:
https://github.com/pfaffman/discourse-pfaffmanager/blob/master/app/controllers/pfaffmanager/servers_controller.rb#L53-L70

하지만 다른 사용자가 post 요청을 수행할 때 제 스펙은 200을 반환하고 있습니다:
https://github.com/pfaffman/discourse-pfaffmanager/blob/master/spec/requests/servers_controller_spec.rb#L149-L157

아마도 Ember가 이 부분을 인식하도록 somehow 조치를 취해야 할 것 같습니다.

before_action에 조건을 확인하는 메서드를 전달할 수 없나요?

권한은 컨트롤러나 제약 조건에서 강제되어야 한다고 생각합니다. 모델은 누가 자신을 호출하는지 알 수 없다고 보거든요.

이 문제에 대해 생각해 주셔서 정말 감사합니다.

사용자가 특정 작업을 수행할 수 있는지 확인하기 위해 가디언(guardian) 메서드가 필요하다고 생각합니다. 예를 들어 can_upgrade_server? 같은 메서드요.

또한, 그렇게 한 후에는 guardian.ensure_can_upgrade_server! 메서드를 사용할 수 있습니다. 이 메서드는 조건을 확인하고 예외를 발생시키는데, 저는 이것이 정확히 원하시는 기능이라고 생각합니다.

우와! 가디언 메서드! 그래! 그거 한번 볼게! 고마워.

guardian을 사용하는 유일한 모델은 사용자 모델입니다. guardian 관련 작업의 대부분은 컨트롤러에서 이루어지는 것으로 보입니다.

예를 들어, 카테고리 컨트롤러는 ensure_can_create_category를 사용하는데, 이는 lib/guardian.rb에서 마법처럼 생성된 것으로 추정됩니다.

하지만 현재 저는 guardian을 사용하지 않고 있습니다. 올바르게 인스턴스를 생성하는 방법을 파악하는 데 어려움을 겪고 있기 때문입니다. 제 컨트롤러에는 다음 코드가 있습니다:

https://github.com/pfaffman/discourse-pfaffmanager/blob/master/app/controllers/pfaffmanager/servers_controller.rb#L54-L75

그리고 이를 테스트하는 스펙은 다음과 같습니다:

https://github.com/pfaffman/discourse-pfaffmanager/blob/master/spec/requests/servers_controller_spec.rb#L154-L181