2010-08-18 2 views
2

우리는 java로 작성된 웹 서비스를 통해 "register"메소드를 사용할 수 있어야하므로 Drupal API에 액세스 할 수 없습니다. 그러나 우리는 사용자를 성공적으로 등록 할 수 있어야합니다. 새로 생성 된 사용자가 성공적으로 로그인 할 수 없기 때문에 users 테이블에 사용자를 추가하기 만하면됩니다. 다시 Drupal API를 좋아하고 항상 올바른 방법으로 사용하지만이 경우에는 교수진이 필요하지 않습니다. 이 딜레마에 대한 통찰력?API를 사용하지 않고 Drupal 6.x에 사용자를 등록하는 방법은 무엇입니까?

답변

2

user_save() API 함수를 단계별로 실행하여 새 사용자를 만들 때 Drupal이 수행하는 작업에 대한 아이디어를 얻을 수 있습니다.

데이터 유형을 저장하면 드루팔 (Drupal)이하는 일에는 깊은 마법이 없습니다. 모든 것이 데이터베이스에 있습니다. 따라서 Drupal API를 사용할 수 없다는 것은 이상적이지 않지만 실제로는 두 개의 데이터베이스 삽입 (예 : 이미 완료 한 테이블 삽입)과 {users_roles} 테이블 삽입 (insert)을 처리하는 것입니다.

정보에 따르면 누락 된 링크는 {users_roles} 테이블에 새 사용자의 UID에 대한 행을 추가하지 않는다고 생각됩니다. user_save()의 관련 라인 :

db_query('INSERT INTO {users_roles} (uid, rid) VALUES (%d, %d)', $account->uid, $rid); 
$account->uid가 새로 만든 사용자의 UID입니다

$rid는 사용자에게 부여 할 역할의 ID입니다. 신규 사용자는 적어도 authenticated user 역할이 필요합니다.

user_save()에있는 다른 모든 항목은 주로 위생 검사 (user_save() 새 사용자를 생성하는 것 외에도 사용자 업데이트 처리) 및 후크 발사입니다.이 유스 케이스에 대해서는 걱정할 필요가 없습니다.

+0

사용자가 생성되면 사용자는 언제든지 "이용 약관에 동의합니다"페이지로 이동합니다. 그들이 받아들이는지 여부에 상관없이 그들은 더 이상 갈 것 같지 않습니다. – jini

+0

@jini, Drupal 코어에는 이용 약관 시스템이 없습니다. contrib 모듈이 로그인을 차단하고있는 것처럼 들립니다. 코드의 유효성 검사 방법을 확인하려면 코드를 살펴보아야합니다. 새 사용자의 UID를 사용하여 해당 모듈의 테이블에 행을 추가해야합니다. –

2

아마도 Mark의 방법이 가장 효율적이지만 구현이나 유지 관리가 가장 쉽지는 않습니다. 기여 모듈은 사용자가 데이터베이스에 삽입 될 때 반응 할 수 있습니다. Drupal을 사용하지 않으면이 모듈을 놓치고 각 모듈을 수동으로 구현해야합니다.

간단한 해결책은 Java 구현에서 호출 할 수있는 메뉴 콜백을 만드는 것입니다. 당신이 정말로해야 할 일은 관련된 정보를 드루팔 (Drupal)에 올리고 user_save으로 전화하는 것입니다. 추가 요청이 필요하지만 드루팔 (Drupal) 훅 시스템과 새로운 모듈이 추가되면 더 이상 유지할 수없는 솔루션을 얻을 수 있습니다.

누구든지이 방법으로 사용자를 만들 수 없게하려면 허용 된 IP에 대한 설정을 만들고 액세스 콜백에서 피초 동자의 IP를 확인하십시오. 이는 서버 만 사용자를 만들 수 있기 때문에 가장 쉽고 안전한 솔루션이어야하며 무차별 대입 공격은 성공할 수 없습니다.

1

더 쉬운 솔루션은 hook_menu()을 구현하는 사용자 지정 모듈을 만들어 Java 응용 프로그램에서 호출되는 메뉴 콜백을 추가하는 것입니다.
이 솔루션의 문제점은 익명 사용자가 메뉴 콜백에 액세스 할 수 있어야하므로 안전하지 않습니다. 즉 누군가가 메뉴 콜백 항목을 발견하면 사용자가 새 계정을 만들 때 Drupal이 수행 한 검사를 우회하는 새로운 사용자를 생성 할 수 있습니다. 예를 들어, Drupal은 사용할 수있는 전자 메일 주소를 확인할 수 있습니다. 출력이 phpinfo()phpinfo.php 파일을 절대로 사용해서는 안되며 모든 사람이 액세스 할 수있는 것과 같은 이유입니다.
해결책은 다른 사용자가 추측 할 수없는 매개 변수를 만든 메뉴 콜백으로 전달하는 것입니다. Drupal 7은 cron.php가 임의의 사용자에 의해 호출되는 것을 피하기 위해 Drupal 구동 사이트를 느리게 만들거나 다른 문제를 일으키는 것을 방지합니다.Drupal은 Drupal 설치 (drupal_get_token())에 따라 예측할 수없는 값을 반환하는 함수를 가지고 있습니다.

또 다른 대안은 사용자 지정 코드에 hook_xmlrpc()을 구현하고 이전 사례에서와 같이 호출자를 확인하는 매개 변수를 받아들이는 새로운 RPC 함수를 노출하는 것입니다.

관련 문제