[英]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.