Получить поле из мнезии - PullRequest
       6

Получить поле из мнезии

2 голосов
/ 21 апреля 2011

У меня есть таблица мнезийных сообщений users с полем пользователя и пароля.

Данные из моей таблицы:

[{users, <<"user_name">>, <<"password">>}].

Мне нужно получить пароль по имени пользователя.Я делаю:

mnesia:dirty_read({users, <<"user_name">>}).

Но он возвращает [].

Как я могу получить пароль по имени пользователя?

Ответы [ 4 ]

0 голосов
/ 27 апреля 2011

Я понимаю, что вы хотите, чтобы ваши пароли проверялись как можно быстрее, но ваш проект находится на стадии, когда вам нужно оптимизировать это?

У меня есть модуль аутентификации в одном из моих проектов, и у меня те же цели, что и у вас. Поскольку у меня еще не было возможности оптимизировать, я использую транзакции и списки 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.

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 показывают, что она работает так, как вы ожидаете.

12> auth:add_user(<<"rodericktaylor">>, <<"binarypassword">>).            
{atomic,ok}
14> true = auth:start_session_dirty(<<"rodericktaylor">>, <<"binarypassword">>).
true
15>

Надеюсь, я помог.

0 голосов
/ 22 апреля 2011

Вы можете сделать что-то вроде ниже:


YourPasswd = mnesia:ets(fun()-> mnesia:dirty_read({users,UserId}) end),

    case YourPasswd of
            [] -> {error, 'No User Found'};
            [{users,_UserID,Passwd}] ->
                {success, Passwd}
    end.

Надеюсь, данные правильно записаны в мнезию :) 1006 *

0 голосов
/ 22 апреля 2011

посмотрите на эту функцию:


-define(TABLE_NAME,users).

get_password_by_username(Username)-> 
     F = fun(U)-> mnesia:read({?TABLE_NAME,U}) end,
     mnesia:activity(transaction,F,[Username],mnesia_frag).

Это даст вам результат. Хорошая вещь с mnesia: активность / 4 в том, что, если таблица фрагментирована или нет, ответы в порядке. удачи

0 голосов
/ 21 апреля 2011

Вы не указали синтаксис записи, который используете, но похоже на

-record (пользователи, {имя пользователя, пароль}).

... или что-то подобное. Итак, предполагая, что когда вы создавали таблицу, вы делали что-то особенное для установки идентификатора? В этом примере «имя пользователя» (первая запись в записи пользователя) должно быть идентификатором по умолчанию, если вы не сделали что-то особенное.

Если у вас продолжают возникать проблемы, попробуйте использовать mnesia: match_object / 1 или / 3 Вы указываете в синтаксисе шаблона / записи часть, которую вы должны сопоставить (в данном случае, имя пользователя), и используете = '', чтобы сопоставить то, что вы не знаете или не заботитесь (в этом случае, это будет часть пароля).

Надеюсь, это поможет!

...