asi*_*niy 0 elixir phoenix-framework
我之所以学习灵丹妙药只是因为互联网上的很多文章都很有希望它的响应时间不到一毫秒.我昨天构建了我的第一个应用程序,我发现它的性能比rails更快.发生了什么?
让我来解释一下我的应用 它实现了ecto-secure-password包提供的基本认证机制:
defmodule HelloPhoenix.User do
use HelloPhoenix.Web, :model
use SecurePassword
schema "users" do
field :first_name, :string
field :last_name, :string
field :username, :string
has_secure_password
end
end
Run Code Online (Sandbox Code Playgroud)
这是我的控制器:
defmodule HelloPhoenix.SessionController do
use HelloPhoenix.Web, :controller
def create(conn, %{ "session" => %{ "username" => username, "password" => password }}) do
if user = HelloPhoenix.User.authenticate(HelloPhoenix.Repo.get_by(HelloPhoenix.User, username: username), password) do
conn
|> put_session(:user_id, user.id)
|> json(UserSerializer.run(user))
else
conn
|> put_status(422)
|> json(%{})
end
end
end
Run Code Online (Sandbox Code Playgroud)
所以,我正在使用这些命令:
MIX_ENV=prod mix compile
MIX_ENV=prod mix phoenix.server
Run Code Online (Sandbox Code Playgroud)
失败和成功认证的响应时间约为~130ms,而此处的rails响应时间约为150ms.我做错了什么?
它"慢",因为密码散列函数(在这种情况下为bcrypt)故意缓慢,以避免暴力攻击.我不认为你应该担心它,因为你只需要在用户登录时散列,而不是每次请求.另一方面,攻击者每次尝试密码时都需要付出代价.
但是,建议在运行测试代码时减少轮次,因为在每个请求上创建用户会使测试速度变慢.慢速测试使开发人员不经常运行它们,这并不好.
ecto-secure-password使用comeonin,因此,如果你想让它在测试环境中更快(不生产使用,因为它是不安全的话),你可以将其配置为只使用几个回合.
将其附加到您的config/test.exs:
config :comeonin, :bcrypt_log_rounds, 4
config :comeonin, :pbkdf2_rounds, 1
Run Code Online (Sandbox Code Playgroud)
而且,当您的测试仍然很快时,生产是安全的(我的测试从15秒变为<1秒).