Elixir / Phoenix restringen parámetros como parámetros fuertes de Rails
Estoy haciendo una aplicación API solo de Phoenix. Vengo de un fondo de Ruby on Rails, así que tengan paciencia conmigo.
Digamos que tengo un modelo de usuario conemail
, password
, password_hash
yrole
campos.
Necesito restringir elrole
ypassword_hash
campos de entrada del usuario, o la lista blancaemail
ypassword
campos. En este momento, cualquiera podría publicar este registro como administrador:
{
"user": {
"email": "[email protected]",
"password": "testpw",
"password_hash": "shouldn't allow user input",
"role": "admin"
}
}
Esto normalmente se logra en Rails utilizando parámetros sólidos, que eliminarán los campos que no se especifican explícitamente.
¿Cómo restrinjo / incluyo los parámetros de la lista blanca con Phoenix usando las mejores prácticas?
Este es mi método de creación en mi user_controller:
def create(conn, %{"user" => user_params}) do
changeset = User.registration_changeset(%User{}, user_params)
...
...
end
Y aquí está mi esquema y conjuntos de cambios en el modelo, user.ex. estoy siguiendoen este tutorial, dice "canalizamos el nuevo conjunto de cambios a través del original"
schema "users" do
field :email, :string
field :password, :string, virtual: true
field :password_hash, :string
field :role, :string
timestamps()
end
def changeset(model, params \\ :empty) do
model
|> cast(params, ~w(email), [])
|> downcase_email()
|> unique_constraint(:email)
|> validate_format(:email, ~r/@/)
end
def registration_changeset(model, params) do
model
|> changeset(params)
|> cast(params, ~w(password), [])
|> validate_length(:password, min: 6)
|> put_password_hash()
end
Fénixscrub_params está cerca, pero no suena como lo que necesito.
Creo que puedo lograr esto mediante la coincidencia de patrones, pero no estoy seguro de cómo.