メールでパスワードを取り戻す機能の実現
メールでパスワードを取り戻す機能の実現
1、最近、パスワードを忘れてメールボックスで取り戻すシステムを開発しました.現在のシステムでは、登録時にメールボックスを強制的に入力していますが、その目的はメールバインドで復元し、パスワードを復元することです.Javaでメールを送る機能は言わないで、パスワードを取り戻すことに重点を置きます.
2、他人の考えを参考にする:メールを送る→メールのURLを要求する→urlを検証する→{パスワードの修正に成功したことを検証し、失敗したページにジャンプできない}
ポイントはこのurlをどのように生成するかとどのようにこのurlを解析するかです.注意しなければならないのは1つのurlが1回のパスワードしか修正できないので、同じアカウントで複数のメールを送信すると、最後のメールのurlしかありません.
3、暗号化は偽造攻撃を防止でき、urlは一度に一度しか検証できず、ユーザーをバインドしている.urlの生成:UUIDでランダム鍵を生成できます.
デジタル署名=MD 5(ユーザ名+'$'+有効期限+'$'+鍵key)データベースフィールド(ユーザ名(プライマリ・キー)、鍵key、有効期限)urlパラメータ(ユーザ名、デジタル署名)、鍵keyの生成:各ユーザがパスワードを取り戻したときにこのユーザに鍵keyを生成し、
url example: http://localhost:8080/user/reset_password?sid=D622D6A23FBF86FFE696B593D55351A54AEAEA77&userName=test4
期限切れを生成し、デジタル署名を生成し、urlを生成し、メールを送信する.saveOrUpdate(ユーザー名、キーキーキー、有効期限)
以下springMvcコード
リンクを取り戻してメールボックスに送った.メールボックスにアクセスしてリンクを開く
以下はリンク検証コードで、パスワードインタフェースの変更にジャンプしたことを検証します.そうしないと、失敗したインタフェースにジャンプします.
1、最近、パスワードを忘れてメールボックスで取り戻すシステムを開発しました.現在のシステムでは、登録時にメールボックスを強制的に入力していますが、その目的はメールバインドで復元し、パスワードを復元することです.Javaでメールを送る機能は言わないで、パスワードを取り戻すことに重点を置きます.
2、他人の考えを参考にする:メールを送る→メールのURLを要求する→urlを検証する→{パスワードの修正に成功したことを検証し、失敗したページにジャンプできない}
ポイントはこのurlをどのように生成するかとどのようにこのurlを解析するかです.注意しなければならないのは1つのurlが1回のパスワードしか修正できないので、同じアカウントで複数のメールを送信すると、最後のメールのurlしかありません.
3、暗号化は偽造攻撃を防止でき、urlは一度に一度しか検証できず、ユーザーをバインドしている.urlの生成:UUIDでランダム鍵を生成できます.
デジタル署名=MD 5(ユーザ名+'$'+有効期限+'$'+鍵key)データベースフィールド(ユーザ名(プライマリ・キー)、鍵key、有効期限)urlパラメータ(ユーザ名、デジタル署名)、鍵keyの生成:各ユーザがパスワードを取り戻したときにこのユーザに鍵keyを生成し、
url example: http://localhost:8080/user/reset_password?sid=D622D6A23FBF86FFE696B593D55351A54AEAEA77&userName=test4
期限切れを生成し、デジタル署名を生成し、urlを生成し、メールを送信する.saveOrUpdate(ユーザー名、キーキーキー、有効期限)
以下springMvcコード
@RequestMapping(value = "/user/i_forget_password")
@ResponseBody
public Map forgetPass(HttpServletRequest request,String userName){
Users users = userService.findUserByName(userName);
Map map = new HashMap();
String msg = "";
if(users == null){ //
msg = " , ?";
map.put("msg",msg);
return map;
}
try{
String secretKey= UUID.randomUUID().toString(); //
Timestamp outDate = new Timestamp(System.currentTimeMillis()+30*60*1000);//30
long date = outDate.getTime()/1000*1000; //
users.setValidataCode(secretKey);
users.setRegisterDate(outDate);
userService.update(users); //
String key = users.getUserName()+"$"+date+"$"+secretKey;
String digitalSignature = MD5.MD5Encode(key); //
String emailTitle = " ";
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
String resetPassHref = basePath+"user/reset_password?sid="+digitalSignature+"&userName="+users.getUserName();
String emailContent = " . ,
クリックしてパスワードを " +
"
tips: 30 , , ' '"+key+"\t"+digitalSignature;
System.out.print(resetPassHref);
SendMail.getInstatnce().sendHtmlMail(emailTitle,emailContent,users.getEmail());
msg = " , 。 30 ";
logInfo(request,userName," ");
}catch (Exception e){
e.printStackTrace();
msg=" ? , 。";
}
map.put("msg",msg);
return map;
}
リンクを取り戻してメールボックスに送った.メールボックスにアクセスしてリンクを開く
以下はリンク検証コードで、パスワードインタフェースの変更にジャンプしたことを検証します.そうしないと、失敗したインタフェースにジャンプします.
@RequestMapping(value = "/user/reset_password",method = RequestMethod.GET)
public ModelAndView checkResetLink(String sid,String userName){
ModelAndView model = new ModelAndView("error");
String msg = "";
if(sid.equals("") || userName.equals("")){
msg=" , ";
model.addObject("msg",msg) ;
logInfo(userName," ");
return model;
}
Users users = userService.findUserByName(userName);
if(users == null){
msg = " , , .";
model.addObject("msg",msg) ;
logInfo(userName," ");
return model;
}
Timestamp outDate = users.getRegisterDate();
if(outDate.getTime() <= System.currentTimeMillis()){ //
msg = " , .";
model.addObject("msg",msg) ;
logInfo(userName," ");
return model;
}
String key = users.getUserName()+"$"+outDate.getTime()/1000*1000+"$"+users.getValidataCode(); //
String digitalSignature = MD5.MD5Encode(key);
System.out.println(key+"\t"+digitalSignature);
if(!digitalSignature.equals(sid)) {
msg = " , ? ";
model.addObject("msg",msg) ;
logInfo(userName," ");
return model;
}
model.setViewName("user/reset_password"); //
model.addObject("userName",userName);
return model;
}