处理资源所有权的最佳方式



我正在寻找一种很好的通用方法来检查当前登录的用户是否是资源的所有者,他正在尝试显示//删除/…

在应用程序中,链接到用户的每个资源都有一个字段user_id匹配创建它的用户的ID。

是否有一种方法可以用Plug来做到这一点,看起来像:

plug :owner_check when action in [:show]
def show(conn, %{"id" => id}) do
provisioned_device = Devices.get_provisioned_device!(id)
render(conn, "show.html", provisioned_device: provisioned_device)
end

如果登录用户是所有者,呈现show.html页面,如果不是,重定向到错误页面。

所以我可以将它用于所有具有user_id字段的资源?

目前我使用这个逻辑来检查用户是否经过身份验证,但我找不到一种方法来更新它来检查所有权。

def user_check(%Plug.Conn{assigns: %{current_user: nil}} = conn, _opts) do
need_login(conn)
end
def user_check(conn, _opts), do: conn
defp need_login(conn) do
conn
|> put_session(:request_path, current_path(conn))
|> put_flash(:error, "You need to log in to view this page")
|> redirect(to: Routes.session_path(conn, :new))
|> halt()
end

检查用户是否在插件中进行了身份验证非常容易,因为这对于大多数请求来说看起来都是一样的。在请求被路由到你的控制器之前,判断一个用户是否拥有一个资源要困难得多,因为你不能仅仅从参数中判断谁应该是资源的所有者。

如果你真的想让它成为一个插件,你可以有一个加载资源/检查所有权插件,它在选项中接受一个模式,当操作需要一个现有的资源时,通过参数中的id加载资源,并检查user_id是否与当前登录的用户匹配。然后,您可以将其插入控制器,并为该控制器传递适当的模式。

不过,在你的控制器中检查它可能更容易。

最新更新