天天看點

security實作手機驗證碼登陸

項目用的是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","驗證成功");
	}
           

前端根據傳回的消息進行處理,我是這樣處理的:

security實作手機驗證碼登陸

直接跳到首頁,此時己經可以進入系統,至此完成了短信驗證碼的登陸功能 。

繼續閱讀