2013-06-06 3 views
8

저는 인증 용으로 devise를 사용하고 있으며 완벽하게 작동하는 레일 4 앱이 있습니다. 내 유일한 문제는 서버에 배포하고 사용자가 다시 로그인해야만 사용자의 세션이 손실된다는 것입니다.배포 후 Devise 세션이 끊깁니다.

방금 ​​nginx/passenger (내 앱에서 사용하는)를 다시 시작하면 잃지 않습니다. 내 앱을 배포 할 때 잃어 버릴 수 있습니다. 배포를 위해 모든 데이터베이스를 자동으로 지우고 배치 스크립트는 사용자를 생성하는 시드 파일을 실행합니다.

우리는 현재이 종류의 행동을 받아 들일 수 있도록 응용 프로그램을 개발 중이지만 나중에 응용 프로그램이 준비 될 때 미래에는 이런 식으로하지 않을 것입니다.

재 시드로 인한 문제입니까, 아니면 다른 사항을 확인해야합니까? 암호화 된 암호가 바뀔 때마다/시드 작업이 실행될 때마다 변경되는 것을 볼 수 있습니다.이 작업은 사용자 세션이 손실되는 것과 관련이 있습니까?

답변

4

이 동작하는 이유는이 다음이다.

기본적으로 데이터를 다시 시드하면 암호가 다시 계산됩니다 (암호가 같을지라도 새 암호화 된 암호는 이전 암호와 다릅니다). 암호가 변경된 것처럼 보이므로 (암호화 된 다른 암호 필드에 따라) 사용자가 자동으로 sign_out 할 것입니다.

seeds.rb 파일에서 encrypted_password를 설정하고 유효성 검사를 무시함으로써이 동작을 피할 수있었습니다.

7

배포 중에는 데이터베이스를 지워서는 안됩니다. 앱이 실행 중이며 수백 명의 사용자가 있다고 가정 해 보겠습니다. 이제 코드를 변경하고 배포를 수행합니다. POOF 귀하의 모든 데이터와 사용자는 사라졌습니다! 확실히 이것은 당신이 원하는 것이 아닙니다. 동일한 ID와

  • 당신이 파종 된 사용자 : 데이터베이스는 다음과 같은 이유 중 하나 때문일 수 있습니다 쓸어 때

    둘째, 사용자는 로그 아웃됩니다? 다시 시드 할 때 사용자 ID가 변경되면 사용자가 로그 아웃됩니다.

  • 쿠키를 사용하는 대신 config.session_store :active_record_store을 사용하여 데이터베이스에 세션을 저장하고 있습니까? 이 경우 데이터베이스를 삭제하면 세션 테이블이 삭제되고 모든 사용자가 로그 아웃됩니다.

  • Rails 4는 기본적으로 암호화 된 쿠키 저장소를 사용합니다. 그것은 사용자가 로그 아웃됩니다 왜 유일한 이유는 데이터베이스를 닦아,

궁극적으로 데이터베이스에서로드지고 경우에, 당신은 응용 프로그램의 config.secret_token 다시 배포를 변경하지 않는 당신이 있는지 확인하고 그것은 나쁜 습관입니다. 따라서 가장 중요한 것은 입니다. 배포 중에는 데이터를 지우지 마십시오..

+0

우리 앱이 개발 중입니다. 프로덕션 중에있을 때 우리는 이렇게하지 않을 것입니다. 마이그레이션을 추가 할 것입니다 (메시지에 썼습니다). 우리는 변경/테스트를 너무 많이하므로이 초기 단계에서 필요합니다. 사용자의 ID는 시드에 특별히 정의되어 있으므로 사용자는 데이터베이스를 다시 시드 할 때마다 동일한 ID를 갖습니다. 우리는 secret_token을 변경하지 않고 기본값을 사용하고 있습니다. 그렇다면 왜 이런 일이 발생 했습니까? – JohnDel

+0

@ 존 델 다른 두 가지 제안은 어때? 세션 테이블과 사용자 ID? – Subhas

+0

우리는 session_store (이니셜 라이저 내부)로 cookie_store를 사용하고 있으며 사용자는 닦음/재 시드 전후에 동일한 ID를 사용합니다. – JohnDel

2

방금 ​​nginx/passenger (내 앱을 사용하고 있습니다)를 다시 시작하면 잃지 않습니다. 내 애플 리케이션을 배포 할 때 나는 그것을 잃고있다. 배포시 모든 데이터베이스를 자동으로 지우고 배포 스크립트는 시드 파일을 실행하여 사용자도 생성합니다.

새 사용자를 생성하면 이전 사용자가 세션을 잃게됩니다.

새 사용자의 값이 달라지기 때문입니다. 예를 들어 기억 토큰 세트가 없거나 session_id가 user.created_at 또는 user.token_generated_at의 값을 사용하는 경우 데이터베이스를 삭제하고 다시 만들 때마다 세션 식별자가 달라집니다.일부 사용자가 자신의 암호를 변경

매번는, 그 signs_out 자동으로 고안 :

+0

"새 사용자를 생성하면 이전 사용자는 새 세션을 잃게됩니다". 왜? 세션이 브라우저에 저장되어 있지 않습니까? 데이터베이스에 저장하지 않습니다. – JohnDel

+0

세션은 사용자에 따라 다릅니다. 새 사용자를 만들면 전자 메일 주소가 같아도 다른 사용자가 될 수 있습니다. –

+0

모든 사용자 행이 동일합니다 (id, email 등). 데이터베이스에서 변경된 유일한 점은 저장된 암호화된 암호입니다 (동일한 암호를 사용하더라도 devise가 새 문자열로 암호화 함). 왜? 세션에 쿠키를 저장하고 있습니다. – JohnDel

관련 문제