メールでパスワードを取り戻す機能の実現

4832 ワード

メールでパスワードを取り戻す機能の実現
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;
    }