이 방법은 조금 어려운 전문적인 지식이 들어갈 수 있으므로, 서버관리에 초보적이신 분들은 잘보시고 따라하시거나, 따라하지 않을것을 권고합니다..(_ _ )

 

그리고 회원 아이디 설정을 반드시, "아이디"에 두셔야 이 방법이 가능합니다. 로그인계정을 아이디로 쓰시길 권장하고, 회원가입시 아이디도 함께 받으시길 권고합니다.

 

우선 XE의 Ruleset을 먼저 우회를 시켜야 합니다. 왜냐하면 로그인을 할경우 로그인에 사용되는 아이디가, 영문+숫자+_ 문자만 인식하도록 되어있어서 이 부분의 경우 문제가 생길 수 있기 때문이지요. 이경우는 보통 회원가입시에만 룰셋을 적용해주면 된다고 생각합니다, 그래서 로그인에 사용되는 룰셋부터 먼저 제거해야하죠.

 

(이 우회하는 방법으로는 @기진곰 님께서 저에게 XETown Slack 을 통해서 알려주셨습니다. 감사합니다.)

 

xe/modules/member/member.admin.controller.php 파일에서  _createLoginRuleset()  이라는 메소드가 있습니다.

해당 메소드는 로그인을 할때 로그인 룰셋파일을 만들어주는 역활합니다.  그래서 해당 파일이 보통 files/ruleset에 저장됩니다.

 

그래서 먼저 560번째줄의 

$trans = array('email_address'=>'email', 'user_id'=> 'userid');

해당 코드를 

$trans = array('email_address'=>'', 'user_id'=> '');

으로 수정해줍니다.( 삭제가 아닌 수정입니다. )

해당 필터에 대해 룰셋을 강제적으로 적용하지 않는것을 의미한다고 생각하면 됩니다.

그리고, 룰셋을 담당하는 파일이 아래 두곳입니다.

files/ruleset/login.xml 

files/cache/ruleset/*.js

위에꺼는 아까 메소드에서 생성된 파일이기 떄문에 반드시 제거해야하하고, 아래꺼는 캐시파일으로써 저장되는 .js파일인데, 케시파일 재생성으로도 해결가능할지도 모릅니다. 혹시나 모르니, SSH접속하셔서 삭제 하시길 권고합니다.

 

그리고 ruleset/login.xml 파일이 삭제가 되어, 관리자 페이지에 접속하게 되면 member모듈을 업데이트 하라고 나옵니다. 해당 업데이트 하시면 됩니다.

 

여기까지 오셨으면 우회는 마무리입니다.

자 지금부터는 member.controller.php파일에서 작업합니다.

 

xe/modules/member/member.controller.php 파일에서, 로그인을 담당하는 doLogin을 수정할 예정입니다.

 

1672번째줄에 

$user_id_strpos = strpos($user_id, '@');

을 추가합니다. 해당 코드는 user_id값을 받은 것에 @ 가 있는지 없는지를 검사하는 코드입니다. 

@가 있으면 해당 위치의 숫자를, 없을경우 false 를 반환하는 함수이지요. 

그리고 아래쪽 

// check identifier
if($config->identifier == 'email_address')
{
   // Get user_id information
   $this->memberInfo = $oMemberModel->getMemberInfoByEmailAddress($user_id);
   // Set an invalid user if no value returned
   if(!$user_id || strtolower($this->memberInfo->email_address) != strtolower($user_id)) return $this->recordLoginError(-1, 'invalid_email_address');

}

가 있는데 이 부분을

// check identifier
if($config->identifier == 'email_address' || $user_id_strpos !== false)
{
   // Get user_id information
   $this->memberInfo = $oMemberModel->getMemberInfoByEmailAddress($user_id);
   // Set an invalid user if no value returned
   if(!$user_id || strtolower($this->memberInfo->email_address) != strtolower($user_id)) return $this->recordLoginError(-1, 'invalid_email_address');

}

이렇게 바꿔주시면 됩니다. if문에 || $user_id_strpos !== false 추가됩니다.

 

이렇게 수정해두시면, 로그인 아이디 및 이메일을 동시에 사용가능합니다~

 

기진곰님 다시한번 도움주셔서 감사합니다

 

 

람보

profile
람보입니다.
  • profile
    위에 추가하는 코드 없이..
    if문 수정하는 곳에..
    if($config->identifier == 'email_address' || strpos($user_id, '@') !== false)
    이렇게 하셔도 됩니다.
  • profile
    고생하셨습니다:) - _-)b
  • profile
    고생하셨습니다...!!
  • profile
    @람보 @기진곰 님 정말 원했던 기능인데 이렇게 구현해 주셔서 너무너무 감사드립니다!!! 친절하게
    자세한 설명까지해주시다니 두번 감사드립니다!!! 꾸벅~ 꾸벅~
  • ?
    병행해서 쓸수있는 방법을 찾고있었는데, 잘찾은거 같네요..!
  • ?
    욕심나긴 하는데... 초보라 선뜻 적용하기는 겁나네요.
  • profile

    https://github.com/rhymix/rhymix/pull/4

  • ?
    적용했는데
    그래도 이메일로 로그인하라는데 뭐때문일가요 ㅠㅠ
  • ? profile
    룰셋 삭제 확인해보세요.