Algo que he encontrado varias veces al crear plugins es la necesidad de modificar el resultado de las comprobaciones can_* de Guardian. Lo he vuelto a encontrar en el plugin ActivityPub:
Acabo de presentar una PR preliminar que añade un nuevo método de API de plugin del lado del servidor que te permite registrar comprobaciones antes y después de los métodos can_* de guardian, ofreciendo la capacidad de cambiar el resultado del método. Por ejemplo:
add_guardian_check(:before, :edit_post) do |guardian, result, post|
!post.activity_pub_remote?
end
Tengo curiosidad por recibir comentarios sobre el enfoque y la ejecución antes de publicarlo para su revisión.
No veo ningún problema con el registro before_*. El registro after_* es un poco más complicado. En cuanto a seguridad, el registro after_* significa que los plugins pueden anular el núcleo de maneras que pueden ser inseguras. Obviamente, los plugins pueden hacer esto de muchas maneras, pero la API de plugins no debería facilitarlo aún más.
Además, ¿qué sucede si varios plugins consumen el hook after_*? ¿Cuál gana?
Las comprobaciones aceptan un argumento de prioridad. Vea esta especificación
it "respeta la prioridad de la comprobación" do
plugin.add_guardian_check(:after, :edit_post, 2) { false }
plugin.add_guardian_check(:after, :edit_post, 0) { true }
plugin.add_guardian_check(:after, :edit_post, 1) { false }
expect(Guardian.new(user).can_edit_post?(post)).to be_truthy
end
¿Qué tal si limito esta PR solo a las comprobaciones before? Eso serviría a las necesidades inmediatas y reduciría un poco las variables en juego aquí.