it-swarm-ko.tech

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

사용자 이름과 암호를 전달하여 사용자를 로그인 할 수있는 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 중 어느 것도 어쨌든 데이터를 삭제하지 않은 것 같습니다.

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

41
silkAdmin

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

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;
    }
}
33
user1750

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

Drupal하는 일을 할 수 있습니다 :

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

ser_login_name_validate ()
ser_login_authenticate_validate ()
ser_login_final_validate ()

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

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

user_login_finalize($form_state);

2 단계와 3 단계는 user_login_submit() 을 참조하십시오.

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

19
googletorp

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

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

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

  return $account;
}

사용자 개체를 찾거나로드 할 수없는 경우 $accountFALSE입니다.

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

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

7
kiamlaluno

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

//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();
3
vacho

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

따라서 우리는 :

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

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

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

때로는 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 ";
}
0
Girish Bathyal