Drupal의 세션 관리 및 사용자 인증 이해


16

기본 사용자 인증을 중앙 서버 (예 : SSO 서버)의 인증으로 바꿔야하는 요구 사항이 있습니다.
Drupal을 디버깅함으로써 모든 세션 관리가 includes/session.inc파일 에서 발생한다는 것을 알게되었습니다 . 이미지와 같이 인증을 수행하고 싶습니다.

스냅

시나리오 : 로그인
단계의 세부 사항은 다음과 같습니다.

  1. 로그인 양식을 바꾸어 사용자 이름과 비밀번호를 SSO 서버에 제출하십시오 ( Drupal 이 아니라 .NET에 있음).
  2. 해당 사이트의 데이터베이스를 사용하여 SSO 서버에서 사용자를 인증하십시오. 내 웹 사이트 의 일부 사용자 정의 PHP 페이지 (또는 모듈의 양식)에 응답을 보냅니다 .
  3. 응답을 사용하여 users 테이블 에서 사용자를 식별하고 암호를 확인하지 않고 해당 사용자에 대한 세션을 작성하십시오 (이중 인증을 의미 함). 기본적으로 Drupal은 $insecure_session_name변수 이름 과 값 으로 쿠키를 설정 합니다 $sid. Drupal이 쿠키를 여기에 설정하지 말고 대신 SSO 서버에 변수 값을 보내십시오.
  4. 이 SSO 서버는 값을 쿠키를 만들고, 주요 영역에서 드롭됩니다 domain.com(모두를 생각 나게 my website하고 sso server있는도에하지 드루팔에서 메인 도메인의 하위 도메인에). 그런 다음 drupal 사이트는 해당 쿠키를 사용하여 로그인 할 수 있습니다.

나는 그것이 어려운 질문이라는 것을 알고 있습니다. 어떻게 시작 해야하는지에 대한 포인터를 찾고 있습니까? 그들은 "핵심을 해킹해서는 안된다"고 말합니다. 그래서 내 질문은 :

  1. Drupal 인증 및 세션 관리가 어떻게 작동하는지 이해하려면 어디서 찾아야합니까?
  2. includes/session.inc후크 를 사용하여 함수를 호출 할 수있는 방법이 있습니까 (함수가 있는 주석은 "내부 사용 전용 / 수정되지 않음"이라고 표시)?

참고 : 레코드를 SSO 서버의 중앙 데이터베이스에 유지하도록 동일한 방법을 사용하여 사용자를 등록합니다. 그리고 그 동안 Drupal 사이트 데이터베이스에서 동일한 사용자의 정크 암호를 입력합니다 (로그인하는 동안 암호가 확인되지 않기 때문에).


진정한 SSO (하나의 사이트에 로그인하고 모든 사이트에 로그인)가 필요합니까 아니면 외부 시스템에 대한 인증 만 필요합니까?
mpdonadio

@MPD 하나의 사이트에 로그인하고 모든 사이트에서 동일한 사용자를 인증해야하는 진정한 SSO를 원합니다 (Drupal에 없을 수도 있음)
AjitS

@AjitS 당신이 이것을 성공적으로 구현했다면 당신은 자세한 답변을 넣어주십시오. user_login_finalize를 사용하고 있지만 GDPR 문제로 인해 Drupal에 세부 정보를 저장할 수 없습니다.
Jignesh Rawal

답변:


17

Drupal은 외부 인증을 지원 합니다 . OpenID (코어에 포함), OAuth 커넥터 또는 LDAP 와 같은 Drupal의 대체 인증 모듈이 많이 있습니다 . Drupal 인증 작동 방식에 대해 자세히 알아보십시오. 가장 좋은 방법은 OpenID 및 OAuth 모듈과 코어 로그인 양식 제출 콜백을 보는 것입니다. 그러나 AFAIK는 인증에 성공한 후 항상 정상적인 Drupal 세션을 시작합니다.

세션 관리를 위해 Drupal은 PHP 세션 처리에 연결하고 자체 처리기를 등록합니다. Drupal 세션 백엔드는 자체적으로 플러그 가능하며, session_inc에서 찾을 수있는 기능의 대체 구현을 제공하는 파일 경로로 변수를 설정할 수 있습니다 includes/session.inc. memcache에 모듈에 memcached에 세션을 저장하는 데 사용합니다.

참조를 위해 OpenID 모듈은 성공적인 인증을 처리하는데,이 인증 openid_authentication()자체 는 사용자 로그인 양식 제출 핸들러 (예 :)를 인용 하고 호출합니다 user_login_submit(). 이 제출 핸들러 자체는 간단하며, 성공적으로 인증 된 사용자를 user_load()글로벌 $user변수 로 로드 한 다음 user_login_finalize(), 세션을 처리 할 user테이블, 테이블 에서 로그인 타임 스탬프를 호출하고 hook_user_login()구현을 호출 합니다.

다른 옵션은 user_external_login_register()기능을 사용하는 것입니다. 이 함수는 외부 사용자를 로그인합니다. 필요한 경우 로컬 사용자도 생성합니다. 로컬 사용자 생성에 대한 제어가 필요한 경우, 당신은 항상 사용할 수있는 user_save(), user_set_authmaps(), user_login_submit()user_external_load()사용에서 사용자 정의 전화 user_external_login_register()해야할 일들의 템플릿으로.


2
이것은 꽤 많은 자리에 있습니다. 외부 사용자 로그인의 Drupal 측은 놀라 울 정도로 쉽습니다. 무거운 리프트 (있는 경우)는 실제로 외부 시스템과 인터페이스하고 있습니다.
mpdonadio

@ MPD 내 특별한 경우에 그 반대를 찾으십시오. 외부 시스템 = JSON 웹 서비스 = 비교적 쉬운 것. 드루팔 행동 = 예측할 수 없을 정도로 버전에서 버전으로 변경 = 지옥처럼 어려우며 상황이 깨질 때 유용한 진단 기능이 없습니다.
Trejkaz

1

user_authenticate () APi가 유용 할 것입니다.

3. 응답을 사용하여 users 테이블 에서 사용자를 식별하고 암호를 확인하지 않고 해당 사용자에 대한 세션을 만듭니다 (이중 인증을 의미 함). 기본적으로 Drupal은 $insecure_session_name변수 이름 과 값 으로 쿠키를 설정 합니다 $sid. Drupal이 쿠키를 여기에 설정하지 말고 대신 SSO 서버에 변수 값을 보내십시오.

편집 : SSO 서버가 true로 돌아 오면이 API를 사용하여 자동으로 세션을 관리하는 사용자를 로그인하십시오. user_authenticate()직접 세션을 만드는 대신 사용하면 더 좋습니다 . 유효한 p-assowrd가 제공되는 한 이중 인증조차도 문제를 일으키지 않아야합니다.

확실하지 않습니다. 4. 쿠키가 두 도메인에서 모두 보이기를 원하십니까? 그렇다면 settings.php $cookie_domain에서 도메인으로 초기화 하십시오. 그런 다음 하위 사이트의 쿠키는 상위 사이트에서 사용할 수 있습니다.


당신의 응답을 주셔서 감사합니다. user_authenticateDrupal 사이트에서 인증을 수행 할 필요가 없기 때문에 사용할 수 없습니다 . 나는 호출하여 세션을 생성 할 수 있습니다 drupal_session_generate()drupal_session_regenerate()session.inc 파일에서. 쿠키 요구 사항에 대한 정보를 얻었습니다. 편집 내용을 참조하십시오.
AjitS

@indrock 링크를 확인하십시오. User_authenticate를 사용하면 사용자 이름과 비밀번호가 정확하면 사용자를 로그인 할 수 있습니다. 3 단계에서 SSO 서버에서 사용자 이름 및 패스가 올바른지 확인한 후이 API를 사용하여 사용자를 로그인하십시오. 그러나 Drupal에는 암호가 저장되어 있어야합니다. 이렇게하면 해킹 코어보다 훨씬 쉬워집니다.
GoodSp33d
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.