포럼
howlogin 애드온 개발 히스토리
2014.09.02 10:49
제로보드시절 사이트 로그인 시 얼마만에 접속했다는 메시지를 띄우는 기능을 만들어서 사용했습니다.
XE에서도 있었으면 좋겠다라는 생각으로 애드온 개발을 시작하지만..
생각지 못한 난관에 부딪히고 맙니다..
로그인 처리는 member 모듈에서 doLogin() 함수를 이용하여 처리하는데...
이 부분이 실행되기전이나 안으로 침투(?)할 방법이 없었습니다....(제가 실력이 부족해서 모르는 것일 수도.ㅎ.ㅎ)
그래서 완전 포기하고 잊고 지내고 있었습니다.
그러던 중 DRAWHOLIC님께서 최근 로그인 시간이 나왔으면 좋겠다라는 의견을 보고
개인적으로 얼마만에 로그인했는지 체크해주는... 그런 애드온을 만들어보려 했으나,
로그인하는 한 시점을 잡지 못해서 포기했습니다...
라는 댓글을 달았습니다.
말그대로 시점을 못잡아서 ... 문제였는데...
왜냐면 doLogin이 실행되면 바로 로그인 시간을 갱신하기 때문이지요...
그러다가 완전히 다른 쪽으로 생각을 해봤습니다...!
어차피 로그인할 때 ID는 입력하니까!!
로그인이 실행되기 전에 id 값을 기준으로 lastlogin 을 구한 후 세션으로 저장하면 되지 않을까?!
기본적으로 폼필드로 넘어온 값은 $_GET['필드명'] 이나 Context::get('필드명');으로 불러올 수 있습니다.
그래서 id값을 받아서 query를 돌려서 lastlogin 값을 우선 변수로 할당합니다.
하지만 로그인이 실패했을 경우에는 저장할 필요가 없기 때문에
그냥 그대로 리턴해버리고...로그인이 성공했을 경우 아까 저장했던 변수를 세션으로 저장합니다.
로그인 성공여부를 확인하는 방법은....
다음과 같은 포지션을 잡고
if($called_position == 'after_module_proc' && Context::get('act') == 'procMemberLogin'){
}
$output->error 값이 0이면 로그인 성공 0이 아니면 기타 에러... 입니다..(로그인실패)
이런식으로 하니 성공합니다..!
하지만... 개인적으로는 모르겠습니다.
저는 이쪽에 전문가가 아니다보니... 로그인 시도시마다 디비 쿼리를 날리기 때문에... 어떤 상황이 벌어질 지는 모르겠네요..
그래서 쿼리 자체는 lastlogin만 받아오도록 해놔서... 딱히 문제가 되진 않을 거라 생각은 됩니다만...
네.. 아무튼... 그 외에 이전 시간 정보를 출력하기 위해 별도로 세션을 할당해놨고..(추가기능)
이전 접속 시간에 따라 알림창을 띄울 건지 설정도 추가해봤습니다...
아무튼 생각을 조금 바꾸면 이런 것도 가능하구나... 라는 걸 알게된 계기였던 것 같습니다.
댓글 10
-
키스투엑스이
2014.09.02 12:05
-b -
애니즌
2014.09.02 12:34
ㅇㅅㅇ!
-
몽실아빠
2014.09.02 12:21
요게... 단순히 마지막 로그인 시간을 보여줘서 나 아닌 다른 누군가 혹시 로그인 했었나 ? 하는 것도 확인 할 수 있지만 오랜만에 방문을 하게 되면 메시지가 뜨니 왠지 방문독려의 좋은 메시지가 되는 효과도 있더라구요 ㅋ
뭐 팝업 문구를 애교스럽게 바꾸면 더 재미나겠지요 ㅋ 메시지를 보면서 내가 몇일만에 방문했구나 한동안 여기를 잊고 있었네.. 뭐 이런 생각이 들게 하는 메세지라고 할까요 ??
회원제 커뮤니티에게는 잇템입니다!
-
애니즌
2014.09.02 12:36
맞습니다! 사실 위젯등에 이전 접속시간을 띄우기 위한 세션 활용은 몽실아빠님 의견으로 추가한 것입니다. ㅎㅎ
저야... 로그인 위젯이 별도로 없어서 필요 없긴 하지만...
유용할 것 같더군요 ㅎㅅㅎ..!
다만 자동로그인의 경우에는 사용이 안되기 때문에...(털썩)
-
oscarmike
2014.09.02 12:25
정말 대단하세요 .. -
애니즌
2014.09.02 12:35
아닙니다..ㅎㅎ 전 그냥 디자이너일 뿐...
-
카르마
2014.09.02 12:36
last_login값은 쿼리를 날리지 않아도 됩니다.
$logged_info->last_login에 값이 저장되어있으니까요.
따라서 procMemberLogin 전후의 $logged_info->last_login 값을 비교하는 것이 가장 간단한 애드온이 될 것같습니다.
즉......
if($called_position == 'before_module_proc' && Context::get('act') == 'procMemberLogin'){
세션['last_login'] = $logged_info->last_login;
}
if($called_position == 'after_module_proc' && Context::get('act') == 'procMemberLogin'){
$last_login = $loged_info->last_login;
세션['last_login'] 과 값이 다르면 alert("지난번 마지막 로그인은 세션['last_login'] 입니다.");
세션제거...
}
-
dev_ratdp
2014.09.02 12:38
오호 . .
-
애니즌
2014.09.02 12:39
직접 해보시면 아시겠지만 위와 같은 방법으로는 해당 값은 NULL이 됩니다..ㅎ
혹시 몰라 다시 한번 테스트해봤지만 역시나 NULL..
before_module_proc 상태에서는.. 로그인이 실행이 안된 상태(?) 같습니다.(doLogin()실행전)
따라서 당연히 $logged_info가 할당이 안되었죠..
-
카르마
2014.09.02 13:10
그렇네요.
로그인 전이니까 당연히 값이 없겠지요.
before에서 ID값으로 쿼리를 해야겠네요.