項目用的是security來做安全校驗,表單驗證的就不談了,現在講一下我用手機驗證碼登陸的思路及實作方式。
手機驗證碼登陸的思路如下:
1、使用者輸入手機号,點選擷取驗證碼
2、系統生成随機驗證碼,儲存到緩存中,同時給使用者下發驗證碼資訊。
3、使用者輸入驗證碼後,和緩存中進行比對。
4、如果驗證碼正确,查出手機對應的使用者。
5、根據查出來的使用者,生成使用者令牌,完成驗證。(我主要就講這裡,其它步驟并不是重點,直接上代碼)
@RequestMapping("/ajaxLogin")
@ResponseBody
public BaseResult<T> ajaxLogin(@RequestBody String json) {
log.info("json============="+json);
//校驗驗證碼
String checkrs=userRemote.checkCheckCode(json);
log.info("checkrs============="+checkrs);
if(checkrs.equals("error")) {
//如果校驗失敗,傳回錯誤資訊
return new BaseResult<>("001","驗證碼校驗錯誤");
}
//如果校驗正确,根據手機号查出使用者資訊
JSONObject object=JSONObject.parseObject(json);
String phone=object.getString("phone");
String userrString=userRemote.getUserInfoByPhone(phone);
log.info("userrString============="+userrString);
if(StringUtils.isBlank(userrString)) {
return new BaseResult<>("001","手機号未注冊或未綁定使用者");
}
JSONObject userObject=JSONObject.parseObject(userrString);
/** 上面是驗證碼驗證和查出使用者資訊,不具有參考性
*下面為完成驗證的過程,一共分為3步
* 第1步:建立一個使用者資訊的實體類,這個類和表單驗證的類為同一個,必須實作UserDetails接口,
**/
String passwd=userObject.getString("password");//擷取使用者密碼
String id=userObject.getString("id");//擷取使用者id
String roles=userRemote.getRole(id); //擷取使用者角色
String loginName=userObject.getString("loginName");//擷取使用者登陸名
User user = new User(loginName, passwd, AuthorityUtils.commaSeparatedStringToAuthorityList(roles)); //建立實體類
user.setId(id);
user.setName(userObject.getString("userName"));
/**
*第2步:根據使用者的實體類,建立使用者令牌
**/
Authentication authentication=new UsernamePasswordAuthenticationToken(user, passwd, user.getAuthorities());
/**
*第3步:把使用者令牌設定為目前會話的上下文驗證令牌
**/
SecurityContextHolder.getContext().setAuthentication(authentication);
return new BaseResult<>("000","驗證成功");
}
前端根據傳回的消息進行處理,我是這樣處理的:
直接跳到首頁,此時己經可以進入系統,至此完成了短信驗證碼的登陸功能 。