프로그래밍 방식으로 사용자를 로그인하려면 어떻게합니까?


41

사용자 이름과 암호를 전달하여 사용자를 로그인 할 수있는 API를 찾고 있습니다. 누구든지 이것에 경험이 있습니까?

명확히하기 위해 홈페이지에 팝업으로 표시되는 AJAX 로그인 상자를 만들려고하는데 잘못된 자격 증명의 경우 페이지를 새로 고치지 않고 로그인이 올바른 경우에만 해당합니다. 그래서 여기까지 내가 한 일이 있습니다.

최신 정보

이제 홈페이지에 로그인 양식을로드 한 다음 제출시이 스크립트에 자격 증명을 보내는 AJAX 요청을 시작합니다.

function user_login_submit_try() {
  global $user;  

  $uid = user_authenticate($_POST['name'],$_POST['pass']);    
  $arr = array ('name'=>$_POST['name'],'pass'=>$_POST['pass']);
  if ($uid){
    $user = user_load($uid);
    user_login_finalize($arr);
  }

  echo drupal_json_encode($uid); 
  exit;
}; 

지금까지는 작동하지만 내 걱정은 (googletorp에서 언급 한) 보안 문제입니다. 이 스크립트에서 사용한 API 중 어느 것도 어쨌든 데이터를 삭제하지 않은 것으로 보입니다.

누구든지 그렇게하는 더 좋은 방법을 보겠습니까?


어떤 이유로 사용자 이름과 비밀번호를 사용하여 코드에서 사용자를 로그인해야합니까?
kiamlaluno

@ kiamlaluno 로그인 양식에 Ajax를 사용해야하므로. 내 선행 질문에서 drupal.stackexchange.com/questions/5780/… drupal.stackexchange.com/questions/5781/… 이 두 가지 문제를 해결할 수 없어서 맞춤형 아약스 요청을했습니다.
silkAdmin

답변:


33

이것은 누군가를 도울 수 있습니다.

function mymodule_user_login_credentials($username, $password)
{
    if(user_authenticate($username, $password))
    {
      $user_obj = user_load_by_name($username);
      $form_state = array();
      $form_state['uid'] = $user_obj->uid;      
      user_login_submit(array(), $form_state);
      return true;
    }
    else
    {
        return false;
    }
}

주석을 기반으로 한 더 나은 버전 :

function mymodule_user_login_credentials($username, $password)
{
    if($uid = user_authenticate($username, $password))
    {
      user_login_submit(array(), array('uid' => $uid));
      return true;
    }
    else
    {
        return false;
    }
}

3
user_authenticate는 이미 $ uid를 반환하므로 사용자 개체를로드 할 필요가 없습니다.)
FLY

7
두 번째 코드 블록은 작동하지 않습니다. user_login_submit의 두 번째 arg는 ref에 의해 전달됩니다. 그것을 전달하면 array ()의 출력이 실패합니다.
Shawn Conn

이 답변은 사용자가 등록 양식을 사용하여 작성된 후 자동 로그인하는 데 어떻게 사용됩니까? 그렇게하고 싶지만 암호는 계정 객체를 매개 변수로 제공 할 때 해시 hook_user_insert이지만 대답의 위 기능은 암호를 원래 일반 텍스트로 원합니다. 내가 hook_form_alter대신 시도해야 할 것 같아요 ...
therobyouknow

새 사용자가 생성 된 직후 (예 : '사용자 / 등록'과 같은 사용자 가입 등록 양식을 통해) 자동 로그인을 찾는 사람들은 다음 솔루션을 참조하십시오. drupal.stackexchange.com/a/254905/1082
therobyouknow

19

이를위한 간단한 API 함수는 없습니다.

Drupal의 기능은 다음과 같습니다.

  1. 데이터베이스를 조회하여 비밀번호를 테스트하십시오.

user_login_name_validate ()
user_login_authenticate_validate ()
user_login_final_validate ()

  1. 을 덮어 씁니다 global $user.

    global $user;
    $user = user_load($uid);
  2. 세션 처리

user_login_finalize($form_state);

2 단계와 3 단계는 user_login_submit()

이러한 모든 함수는 폼에서 호출 된 것을 기반으로합니다. 정상적인 흐름은 유효성 검사 핸들러가 사용자 입력을 테스트하고 유효성 검사가 통과되면 사용자의 uid를 반환하는 것입니다. 제출 핸들러는 사용자의 실제 로그인 및 호출 사용자 후크를 처리합니다.


googletorp 덕분에,이 기능이 어떻게 작동하는지 궁금해 할 수는 있지만 시도해 볼 것입니다 .. 내가 선례를 부른 것을 어떻게 알 수 있습니까?
silkAdmin

아 그리고 From_state 변수를 사용할 수 없지만 사용자 이름과 암호 만 있으면 다음 $form_state['value']['name'] = $_POST['name']과 같이 다시 작성할 수 있습니다 .
silkAdmin

@silk 항상 $form_state변수 를 제공하는 Drupal FAPI를 사용해야합니다 . 그렇지 않으면 사이트를 느슨하게하여 공격에 대비할 수있는 유용한 보안 검사가 많이 있습니다. 사용자 로그인과 관련하여 해당 보안을 풀고 싶지 않습니다.
googletorp

업데이트 된 질문을 확인하십시오. 입력이 정리되었는지 알고 싶습니다 .. 감사합니다
silkAdmin

죄송하지만 수정 사항이 처음에는 작동하지 않아 업데이트되었습니다.
silkAdmin

7

사용자 이름과 비밀번호를 알고있는 사용자 계정에 대한 사용자 개체를 가져와야하는 경우 다음 코드를 사용할 수 있습니다.

function mymodule_get_user(name, $password) {
  $account = FALSE;

  if ($uid = user_authenticate($name, $password)) {
    $account = user_load($uid);
  }

  return $account;
}

$account될 것입니다 FALSE사용자 개체가 발견 또는로드 할 수없는 경우.

예를 들어, 모듈이 사용자로부터 입력으로 사용자 이름과 비밀번호를 가져 와서 올바른지 확인한 다음 사용자 객체로 무언가를 수행 할 때이 코드를 사용해야합니다.
주석을 작성하도록 사용자를 가장해야하거나 사용자가 수행해야하는 다른 작업을 수행해야하는 모듈을 작성하는 경우 프로젝트 이슈 추적 모듈은 프로젝트 이슈 추적 모듈이 2 주 동안 고정 상태 (이 경우 "시스템 메시지"사용자가 작성한 결과 "활동없이 2 주 동안 수정 된 문제"라는 주석이 추가됨) 사용자 이름과 비밀번호가 필요하지 않습니다. 사용자 ID를 알고있는 사용자 개체 만로드하면됩니다.

내가 아는 한, 내가보고 한 코드에는 보안 문제가 없습니다.
실패한 로그인 수를 제한 할 수 있습니다. 또는 성공하지 않고 로그인을 시도하거나 짧은 시간 내에 다른 로그인을 시도하는 IP를 일시적으로 차단합니다.


감사합니다 kiamlaluno, 그것은 내가 한 일이지만 지금은 보안 문제에 대해 걱정하고 있습니다. 업데이트 된 질문을 확인하십시오.
SilkAdmin

3

이 코드는 실제로 작동합니다

//login
$uid = user_authenticate($username, $password);
global $user;
$user = user_load($uid);    
//login finalize
watchdog('remote_user', 'Session opened for %name.', array('%name' => $user->name));
$user->login = REQUEST_TIME;
db_update('users')
  ->fields(array('login' => $user->login))
  ->condition('uid', $user->uid)
  ->execute();
drupal_session_regenerate();

hook_user_login을 호출하지 않습니다. user_login_finalize () 함수를 참조하십시오.
skorzh

2

위의 답변을 정리했습니다. 사용자 및 비밀번호 확인은 추가 기능입니다. 또한 가짜 form_state는 함수를 참조하여 전달할 변수 여야합니다. 그렇지 않으면 오류가 발생합니다.

따라서 우리는 :

function mymodule_log_in_by_uid($uid) {
    $faux_form_state = array('uid' => $uid);
    user_login_submit(array(), $faux_form_state);
}

0

사용자는 세션을 수신하고 다른 페이지에도 로그온합니다.

function custom_log_in_by_uid($uid) {
    $form_state = array('uid' => $uid);
    user_login_submit(array(), $form_state);
}

0

때로는 URL 또는 빠른 관리자 비밀번호로 로그인해야합니다. Drupal에서 사용자 1로 로그인하려면 아래 두 가지 기능을 구현하십시오.

function mymodule_menu(){
    $items['login/as/admin'] = array(
        'title' => 'Login as admin account',
        'page callback' => 'mymodule_login_as_admin',
        'access callback' => TRUE,
        'type' => MENU_CALLBACK,
    );
    return $items;
}
function mymodule_login_as_admin(){
    global $user;
    $user = user_load(1);
    return "Global user set as admin. Please refresh page ";
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.