繁体   English   中英

限制用户从 Elixir 和 phoenix web 应用程序中的变更集中删除

[英]Restrict user deletion from changeset in Elixir and phoenix web application

我们可以根据他的 email 地址在 elixir 和 phoenix web 开发中的 Repo.delete!(changeset) 条件限制从数据库中删除用户吗

这就是我现在使用的代码。 我想在删除期间限制从数据库中删除两个用户:-

def delete(conn, _params, current_admin) do

    changeset = AdminUser.common_changeset(conn.assigns.admin_user, %{}, whodoneit(current_admin))

    Repo.delete!(changeset)

    msg = gettext("%{name} deleted successfully", name: gettext("Administrator"))

    conn
    |> put_flash(:success, msg)
    |> redirect(to: Routes.admin_admin_user_path(conn, :index))

end

尽管防止对某些“粘滞记录”采取行动的正确方法是更改数据库以拒绝此类修改(见下文),但仍然可以使用Ecto.Changeset.validate_change/3及其更明确的兄弟Ecto.Changeset.validate_exclusion/4 那里的示例显示了如何防止根据值验证某些变更集。

更通用的方法是实现Ecto.Repo.delete/2 (和Ecto.Repo.delete!/2 )回调以在委托给默认Ecto.Repo.Schema.delete/4之前检查值

@impl Ecto.Repo
def delete(struct, opts \\ []) do
  # check the record and execute the code below
  #   if and only if the check passed
  Ecto.Repo.Schema.delete(
    __MODULE__,
    get_dynamic_repo(),
    struct,
    with_default_options(:delete, opts)
  )
end

它仍然很容易出错,因为人们可能只是通过Ecto.Adapters.SQL.query/4执行原始查询

Ecto.Adapters.SQL.query(MyRepo, "DELETE FROM users WHERE email = ", [admin_email])

此外,您可能会修改email ,在这种情况下,您可能想要防止UPDATE


也就是说,go 的唯一正确方法是依靠数据库拒绝此类删除。 可以使用TRIGGER或 PostgreSQL 中的RULE来完成。 这将是触发示例。

CREATE OR REPLACE FUNCTION prevent_email_hacks()
  RETURNS "trigger" AS
'
BEGIN
  IF OLD.email = "admin@foo.bar" THEN
    RAISE EXCEPTION \'This email is locked\';
  END IF;
  RETURN NEW;
END;
'
LANGUAGE 'plpgsql' VOLATILE;

CREATE TRIGGER protect_admin
  BEFORE INSERT OR UPDATE OR DELETE
  ON users
  FOR EACH ROW
  EXECUTE PROCEDURE prevent_email_hacks();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM