2017-01-13 5 views
1

Я пишу аутентификацию для Phoenix Elixir приложение. У меня есть Plug в моем Браузер Pipeline, который проверяет user_id в сеансе. Если он существует, я добавить пользователя в свя:сеанс Phoenix не удаляется

router.ex

pipeline :browser do 
    plug :accepts, ["html"] 
    plug :fetch_session 
    plug :fetch_flash 
    plug :protect_from_forgery 
    plug :put_secure_browser_headers 
    plug AccountMgr.Plugs.CheckSessionForUser 
end 

check_for_user_on_session.ex

def call(conn, _opts) do 
    user_id = get_session(conn, :user_id) 

    cond do 
     user = user_id && Repo.get(User, user_id) -> 
     assign(conn, :current_user, user) 
     true -> 
     assign(conn, :current_user, nil) 
    end 
end 

В моих Войти функций добавляют user_id к сессии если учетные данные верны:

cond do 
     user && checkpw(password, user.password_hash) -> 
     conn 
     |> assign(:user, user) 
     |> put_session(:user_id, user.id) 
     |> configure_session(renew: true) 
     |> redirect(to: portfolio_path(conn, :index)) 
     user -> 
     {:error, :unauthorised, conn} 
     true -> 
     dummy_checkpw() 
     {:error, :not_found, conn} 
end 

В моей функции «Выход» я звоню configure_session (conn, drop: true).

def logout(conn, _params) do 
    configure_session(conn, drop: true) 
    redirect(conn, to: authentication_path(conn, :index)) 
end 

Я использую IO.puts показать user_id на сессии до и после того, как я вызываю функцию configure_sessionuser_id и по-прежнему присутствует.

Я также протоколирование user_id в check_for_user_on_session.ex Штекер, и это также показывает user_id подарок, когда он вызывается после перенаправления из функции выхода из системы.

Я не уверен, что мне не хватает, но я ожидаю, что куки сессии будут уничтожены после того, как функции выхода из системы и новый созданный для следующей загрузки страницы через маршрутизатор и Browser трубопровода

Спасибо заранее

+0

Когда вы говорите, что используете 'IO.puts', чтобы показать' user_id', я думаю, вам нужно проверить его со следующим запросом, а не с текущим –

+0

Спасибо Дэвиду, я записал ту же информацию в Plug который проверяет сеанс user_id (он находится в конвейере браузера), и он существует для загрузки страницы перенаправления. – abarr

ответ

4

У функции logout есть ошибки. Оно должно быть:

def logout(conn, _params) do 
    configure_session(conn, drop: true) 
    |> redirect(to: authentication_path(conn, :index)) 
end 

В функции logout вы написали, вы звонили configure_session, но тогда вы не использовали возвращаемое значение, поэтому команда уронить сеанс не был принят к redirect вызова.

+0

Спасибо, Дэвид ... это сводило меня с ума – abarr

Смежные вопросы