<기능개선>

1. PMS NO : 
2. (주요)작업내용 
(1) 보안정책에 따른 비번 룰 적용(사용자단 일괄 적용)
This commit is contained in:
jity7777 2023-03-13 01:30:27 +00:00
parent c6e35b1518
commit 45b91e78fd
8 changed files with 112 additions and 6 deletions

View File

@ -142,6 +142,38 @@ namespace NP.Base.Controllers
} }
return JsonOK(0); return JsonOK(0);
} }
[HttpPost]
public JsonResult UserPassCheck(Users u, VMUser vm)
{
int passResult = 0;
// 중복 사용된 비번이 있을 경우 0 이상의 숫자가 반환됨
if(vm.userno > 0)
{
u.userpass = string.IsNullOrEmpty(u.userpass) ? null : NP.Base.Lib.KISA_SHA256.SHA256Hash(vm.User.userpass.Trim());
if (u.userpass == null)
{
u.userpass = Request["User.userpass"];
}
if (u.userpass != null)
{
u.userpass = NP.Base.Lib.KISA_SHA256.SHA256Hash(vm.User.userpass.Trim());
passResult = Dao.Get<int>("users.pass.check", new System.Collections.Hashtable() { { "userno", vm.userno }, { "userpass", u.userpass } }).FirstOrDefault();
}
}
else
{
u.userpass = string.IsNullOrEmpty(u.userpass) ? null : NP.Base.Lib.KISA_SHA256.SHA256Hash(u.userpass.Trim());
if (u.userpass != null)
{
passResult = Dao.Get<int>("users.pass.check", new System.Collections.Hashtable() { { "userno", SUserInfo.UserNo }, { "userpass", u.userpass } }).FirstOrDefault();
}
}
return JsonOK(passResult);
}
[HttpPost] [HttpPost]
public JsonResult UserExit(String exitreason) public JsonResult UserExit(String exitreason)
{ {

View File

@ -151,7 +151,15 @@ namespace NP.Base.Controllers
} }
if (vm.userno > 0 && !string.IsNullOrEmpty(vm.User.userpass) && vm.User.userpass.Trim() != "") if (vm.userno > 0 && !string.IsNullOrEmpty(vm.User.userpass) && vm.User.userpass.Trim() != "")
{ {
if (Dao.Save("users.resetuserpass", new Hashtable() { { "userpass", NP.Base.Lib.KISA_SHA256.SHA256Hash(vm.User.userpass) }, { "userno", vm.userno } }) == 1) //if (Dao.Save("users.resetuserpass", new Hashtable() { { "userpass", NP.Base.Lib.KISA_SHA256.SHA256Hash(vm.User.userpass) }, { "userno", vm.userno } }) == 1)
//{
// var u = GoLogin(vm.User.userid, vm.User.userpass);
// if (u != null)
// {
// return JsonOK(1);
// }
//}
if (Dao.Save("users.resetuserpass", new Hashtable() { { "userpass", NP.Base.Lib.KISA_SHA256.SHA256Hash(vm.User.userpass) }, { "userno", vm.userno } }) > 0)
{ {
var u = GoLogin(vm.User.userid, vm.User.userpass); var u = GoLogin(vm.User.userid, vm.User.userpass);
if (u != null) if (u != null)

View File

@ -339,7 +339,25 @@
<selectKey type="post" property="userno" resultClass="int">SELECT LAST_INSERT_ID()</selectKey> <selectKey type="post" property="userno" resultClass="int">SELECT LAST_INSERT_ID()</selectKey>
</insert> </insert>
<select id="users.pass.check" parameterClass="hashtable" resultClass="int">
select count(userno)
from userpasslog
where userno = #userno# and userpass = #userpass#
</select>
<update id="users.up" parameterClass="hashtable"> <update id="users.up" parameterClass="hashtable">
<isNotNull property="userpass">
insert into userpasslog (userno, userpass, cdt, uip)
select #userno#, #userpass#, now(), #uip#
from (select 1 col1) a
left outer join userpasslog b on b.userno=#userno#
where b.userno is null;
update userpasslog set userpass = #userpass#
where userno=#userno#;
</isNotNull>
update users set <include refid="sql.up"></include> update users set <include refid="sql.up"></include>
,usertype=#usertype# ,usertype=#usertype#
,userkind =#userkind# ,userkind =#userkind#
@ -381,7 +399,7 @@
,di =case when #di# is not null then #di# else di end ,di =case when #di# is not null then #di# else di end
,ci =case when #ci# is not null then #ci# else ci end ,ci =case when #ci# is not null then #ci# else ci end
,vssn =case when #vssn# is not null then #vssn# else vssn end ,vssn =case when #vssn# is not null then #vssn# else vssn end
where userno=#userno# where userno=#userno#;
</update> </update>
<update id="users.exitjoin" parameterClass="hashtable"> <update id="users.exitjoin" parameterClass="hashtable">
update users set <include refid="sql.up"></include> update users set <include refid="sql.up"></include>
@ -837,7 +855,16 @@
</update> </update>
<update id="users.resetuserpass" parameterClass="hashtable"> <update id="users.resetuserpass" parameterClass="hashtable">
update users set <isNotEmpty property="userpass">userpass=#userpass#,</isNotEmpty>udt=<include refid="sql.now"></include> where userno=#userno# insert into userpasslog (userno, userpass, cdt, uip)
select #userno#, #userpass#, now(), #uip#
from (select 1 col1) a
left outer join userpasslog b on b.userno=#userno#
where b.userno is null;
update userpasslog set userpass = #userpass#
where userno=#userno#;
update users set <isNotEmpty property="userpass">userpass=#userpass#,</isNotEmpty>udt=<include refid="sql.now"></include> where userno=#userno#;
</update> </update>
<select id="users.dormants" parameterClass="hashtable" resultClass="users"> <select id="users.dormants" parameterClass="hashtable" resultClass="users">

View File

@ -73,6 +73,7 @@
function save() { function save() {
if (check("up1", null, "비밀번호를 입력해주세요.")) { } if (check("up1", null, "비밀번호를 입력해주세요.")) { }
else if (!ispassword(val("up1"))) { focus("up1"); msg("(8자 이상, 영문/숫자/특수기호 포함) 규칙으로 비밀번호를 입력해주세요."); } else if (!ispassword(val("up1"))) { focus("up1"); msg("(8자 이상, 영문/숫자/특수기호 포함) 규칙으로 비밀번호를 입력해주세요."); }
else if (isRepeatedString(val("up1"))) { focus("up1"); msg("반복되는 문자/숫자를 사용할 수 없습니다."); }
else if (val("up1") != val("up2")) { focus("up2"); msg("비밀번호확인이 일치하지 않습니다. 다시 입력해주세요."); } else if (val("up1") != val("up2")) { focus("up2"); msg("비밀번호확인이 일치하지 않습니다. 다시 입력해주세요."); }
else { else {
cap("/focommon/findmefinal", "mform", "cbsave"); cap("/focommon/findmefinal", "mform", "cbsave");

View File

@ -185,6 +185,7 @@ else
else if (val("IsSaveOK") != 1) { focus("userid"); msg("중복여부체크를 진행해주세요"); } else if (val("IsSaveOK") != 1) { focus("userid"); msg("중복여부체크를 진행해주세요"); }
else if (check("userpass", null, "비밀번호를 입력해주세요.")) { } else if (check("userpass", null, "비밀번호를 입력해주세요.")) { }
else if (!ispassword(val("userpass"))) { focus("userpass"); msg("(8자 이상, 영문/숫자/특수기호 포함) 규칙으로 비밀번호를 입력해주세요."); } else if (!ispassword(val("userpass"))) { focus("userpass"); msg("(8자 이상, 영문/숫자/특수기호 포함) 규칙으로 비밀번호를 입력해주세요."); }
else if (isRepeatedString(val("userpass"))) { focus("userpass"); msg("반복되는 문자/숫자를 사용할 수 없습니다."); }
else if (val("userpass") != val("userpass2")) { focus("userpass2"); msg("비밀번호 확인이 다릅니다."); } else if (val("userpass") != val("userpass2")) { focus("userpass2"); msg("비밀번호 확인이 다릅니다."); }
else if (check("userpno", null, "주민등록번호를 입력해주세요")) { } else if (check("userpno", null, "주민등록번호를 입력해주세요")) { }
else if (getBytes(val("userpno1")) != 6 || getBytes(val("userpno2")) != 7) { focus("userpno2"); msg("주민등록번호를 확인해주세요"); } else if (getBytes(val("userpno1")) != 6 || getBytes(val("userpno2")) != 7) { focus("userpno2"); msg("주민등록번호를 확인해주세요"); }

View File

@ -33,12 +33,24 @@
} else { } else {
if (check("up1", null, "비밀번호를 입력해주세요.")) { } if (check("up1", null, "비밀번호를 입력해주세요.")) { }
else if (!ispassword(val("up1"))) { focus("up1"); msg("(8자 이상, 영문/숫자/특수기호 포함) 규칙으로 비밀번호를 입력해주세요."); } else if (!ispassword(val("up1"))) { focus("up1"); msg("(8자 이상, 영문/숫자/특수기호 포함) 규칙으로 비밀번호를 입력해주세요."); }
else if (isRepeatedString(val("up1"))) { focus("up1"); msg("반복되는 문자/숫자를 사용할 수 없습니다."); }
else if (val("up1") != val("up2")) { focus("up2"); msg("비밀번호확인이 일치하지 않습니다. 다시 입력해주세요."); } else if (val("up1") != val("up2")) { focus("up2"); msg("비밀번호확인이 일치하지 않습니다. 다시 입력해주세요."); }
else { else {
cap("/fcommon/UserPassCheck", "mform", "save2");
}
}
}
function save2() {
if (capResult.obj == 0) {
cap("/focommon/pwchange", "mform", "cbsave"); cap("/focommon/pwchange", "mform", "cbsave");
} }
else {
msg("이미 사용된 비밀번호는 사용할 수 없습니다.");
} }
} }
function cbsave() { function cbsave() {
if (capResult.code == 1000) { if (capResult.code == 1000) {
bglayer(true); bglayer(true);

View File

@ -325,6 +325,7 @@
} }
function save(idx) { function save(idx) {
if (idx == 1) { if (idx == 1) {
setv("userpass", val("userpass").replace(/ /, '').replace(/ /, '')); setv("userpass", val("userpass").replace(/ /, '').replace(/ /, ''));
setv("userpass2", val("userpass2").replace(/ /, '').replace(/ /, '')); setv("userpass2", val("userpass2").replace(/ /, '').replace(/ /, ''));
setv("username", val("username").replace(/ /, '').replace(/ /, '')); setv("username", val("username").replace(/ /, '').replace(/ /, ''));
@ -345,13 +346,14 @@
setv("edus", ($("#edus1").prop("checked") ? "1" : "0") + ($("#edus2").prop("checked") ? "1" : "0") + ($("#edus3").prop("checked") ? "1" : "0") + ($("#edus4").prop("checked") ? "1" : "0") + ($("#edus5").prop("checked") ? "1" : "0")); setv("edus", ($("#edus1").prop("checked") ? "1" : "0") + ($("#edus2").prop("checked") ? "1" : "0") + ($("#edus3").prop("checked") ? "1" : "0") + ($("#edus4").prop("checked") ? "1" : "0") + ($("#edus5").prop("checked") ? "1" : "0"));
if (val("userpass") != "" && check("userpass", null, "비밀번호를 입력해주세요.")) { } if (val("userpass") != "" && check("userpass", null, "비밀번호를 입력해주세요.")) { }
else if (val("userpass") != "" && !ispassword(val("userpass"))) { focus("userpass"); msg("(8자 이상, 영문/숫자/특수기호 포함) 규칙으로 비밀번호를 입력해주세요."); } else if (val("userpass") != "" && !ispassword(val("userpass"))) { focus("userpass"); msg("(8자 이상, 영문/숫자/특수기호 포함) 규칙으로 비밀번호를 입력해주세요."); }
else if (isRepeatedString(val("userpass"))) { focus("userpass"); msg("반복되는 문자/숫자를 사용할 수 없습니다."); }
else if (val("userpass") != "" && val("userpass") != val("userpass2")) { focus("userpass2"); msg("비밀번호 확인이 다릅니다."); } else if (val("userpass") != "" && val("userpass") != val("userpass2")) { focus("userpass2"); msg("비밀번호 확인이 다릅니다."); }
else if (check("mobile", null, "휴대전화번호를 입력해주세요.")) { } else if (check("mobile", null, "휴대전화번호를 입력해주세요.")) { }
else if (!ismobilenumber(val("mobile"))) { focus("mobile"); msg("휴대전화번호를 확인해주세요."); } else if (!ismobilenumber(val("mobile"))) { focus("mobile"); msg("휴대전화번호를 확인해주세요."); }
else if (!isemail(val("email"))) { focus("email1"); msg("올바른 이메일주소를 입력해주세요."); } else if (!isemail(val("email"))) { focus("email1"); msg("올바른 이메일주소를 입력해주세요."); }
//else if ($("input:radio[name='isCompany']:checked").val() == "1" && check("asno", "btnassign", "직장을 선택해주세요.")) { } //else if ($("input:radio[name='isCompany']:checked").val() == "1" && check("asno", "btnassign", "직장을 선택해주세요.")) { }
else { else {
cap("/fcommon/usersave", "mform", "cbsave"); cap("/fcommon/UserPassCheck", "mform", "save2");
} }
} else if (idx == 0) { } else if (idx == 0) {
$('html, body').addClass('lock'); $('html, body').addClass('lock');
@ -360,6 +362,16 @@
confirmtoggle(true, "탈퇴를 진행하시겠습니까?", "gogo()"); confirmtoggle(true, "탈퇴를 진행하시겠습니까?", "gogo()");
} }
} }
function save2() {
if (capResult.obj == 0) {
cap("/fcommon/usersave", "mform", "cbsave");
}
else {
msg("이미 사용된 비밀번호는 사용할 수 없습니다.");
}
}
function gogo() { function gogo() {
capp("/fcommon/userexit", { exitreason: val("exitreason") }, "cbexit"); capp("/fcommon/userexit", { exitreason: val("exitreason") }, "cbexit");
} }

View File

@ -1036,7 +1036,20 @@ function getBytes(v, nocrtrim) {
} }
function isRepeatedString(str) {
// 반복 문자열 검증
const len = str.length;
for (let i = 1; i < len; i++) {
if (len % i === 0) {
const pattern = str.slice(0, i).repeat(len / i);
if (pattern === str) {
return true;
}
}
}
return false;
}