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.