users
我有一个带有用户和密码字段的记忆表。
我表中的数据:
[{users, <<"user_name">>, <<"password">>}].
我需要通过用户名获取密码。我做:
mnesia:dirty_read({users, <<"user_name">>}).
但它返回[]
。
如何通过用户名获取密码?
看看这个函数:
-定义(TABLE_NAME,用户)。 get_password_by_username(用户名)-> F = fun(U)-> mnesia:read({?TABLE_NAME,U}) 结束, mnesia:activity(transaction,F,[用户名],mnesia_frag)。
那会给你结果。mnesia:activity/4 的好处是无论表格是否碎片化,答案都可以。祝你好运
我了解您希望尽快检查您的密码,但您的项目是否处于需要优化的阶段?
我的一个项目中有一个身份验证模块,并且我的目标与您的目标相似。由于我还没有机会优化,我正在使用 mnsesia 事务和用户名和密码列表。
这是我的身份验证模块的一部分。
-module(auth).
-export([init/1, add_user/2, start_session/2]).
-record(auth_user, {username, password}).
init(Nodes) ->
mnesia:create_table(auth_user,
[{disc_copies, Nodes},
{attributes, record_info(fields, auth_user)}]).
add_user(Username, Password) ->
T = fun() ->
mnesia:write(#auth_user {
username = Username,
password = Password})
end,
mnesia:transaction(T).
start_session(Username, Password) ->
T = fun() ->
mnesia:read(auth_user, Username)
end,
{atomic, Ret} = mnesia:transaction(T),
case Ret of
[U] ->
if (U#auth_user.password == Password) ->
true;
true ->
false
end;
_Else ->
false
end.
编译并启动 erlang shell 之后。
Eshell V5.8.3 (abort with ^G)
1> mnesia:create_schema([node()]).
ok
3> mnesia:start().
ok
4> auth:init([node()]).
{atomic,ok}
5> auth:add_user("rodericktaylor", "password").
{atomic,ok}
6> true = auth:start_session("rodericktaylor", "password").
true
7>
为了查看是否遇到与您相同的问题,我切换到二进制值并进行了脏读。
start_session_dirty(Username, Password) ->
case mnesia:dirty_read(auth_user, Username) of
[U] ->
if (U#auth_user.password == Password) ->
true;
true ->
false
end;
_Else ->
false
end.
erl shell 中的以下命令表明它可以按照您的预期工作。
12> auth:add_user(<<"rodericktaylor">>, <<"binarypassword">>).
{atomic,ok}
14> true = auth:start_session_dirty(<<"rodericktaylor">>, <<"binarypassword">>).
true
15>
我希望我有所帮助。
您可以执行以下操作:
YourPasswd = mnesia:ets(fun()-> mnesia:dirty_read({users,UserId}) end), 案例 YourPasswd 的 [] -> {错误,'未找到用户'}; [{users,_UserID,Passwd}] -> {成功,密码} 结尾。
希望数据正确写入mnesia :)
您没有指定您正在使用的记录语法,但它看起来像
-记录(用户,{用户名,密码})。
...或类似的东西。所以,假设当你创建表时,你做了什么特别的事情来设置 id?在这个例子中,“用户名”(用户记录中的第一个条目)应该是默认的 id,除非你做了一些特别的事情。
如果您仍然有问题,请考虑使用 mnesia:match_object/1 或 /3。您在模式/记录语法中指定必须匹配的部分(在本例中为用户名),并使用=' ' 匹配您不知道或不关心的任何内容(在本例中为密码部分)。
我希望这会有所帮助!