往期笔记已经实现了用户名密码的登录方式,现在,我们要扦插验证码进行登录,下面,简单记录下实现的过程。
首先就是回到之前创建好的AdminLoginParam实体类中,添加变量code:
@ApiModelProperty(value = "验证码",required = true)
private String code;
然后就要回到登录接口中,也就是在LoginController控制层中的login方法中获取用户输入的验证码:
//adminLoginParam.getCode(),获取到用户输入的验证码
@ApiOperation(value = "登录之后返回token")
@PostMapping("/login")
public RespBean login(@RequestBody AdminLoginParam adminLoginParam, HttpServletRequest request){//这里需要拿到用户传过来的AdminLoginParam实体信息和,HttpServletRequest
return adminService.login(adminLoginParam.getUsername(),adminLoginParam.getPassword(),adminLoginParam.getCode(),request);
}
记得要顺着实现接口的步骤:控制层-》服务层-》实现层-》mapper(数据库层)的顺序把code参数都补全:
//IAdminService
RespBean login(String username, String password,String code, HttpServletRequest request);
//AdminServiceImpl中String code是新补全的
@Override
public RespBean login(String username, String password, String code, HttpServletRequest request) {
//因为之前生成的在生成验证码的文件中已经把生成的验证码放到session中,所以可以在session中获取
String captcha = (String) request.getSession().getAttribute("captcha");
//对验证码校验一下
if(StringUtils.isEmpty(code)||!captcha.equalsIgnoreCase(code)){
return RespBean.error("验证码输入错误,请中心");
}
//登录
UserDetails userDetails=userDetailsService.loadUserByUsername(username);//通过用户名获取userDetail
if(userDetails==null||!passwordEncoder.matches(password,userDetails.getPassword())){
return RespBean.error("用户名或密码错误!");
}
if(!userDetails.isEnabled()){
return RespBean.error("账号被禁用!请联系管理员");
}
//更新security登录对象到spring security全文中
UsernamePasswordAuthenticationToken authenticationToken=new UsernamePasswordAuthenticationToken(userDetails,null,userDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
//账号和密码都没问题时,就可以通过userDetail生成token
String token =jwtTokenUtil.generateToken(userDetails);
Map<String,String> tokenMap=new HashMap<>();
tokenMap.put("token",token);
tokenMap.put("tokenHead",tokenHead);
return RespBean.success("登录成功!",tokenMap);
}
上面方法的开始是补全我们需要验证码登录需要获取存储在session中的验证码的方法,以及校验,如果成功,则走登录逻辑,否则,返回错误信息!!!以上就是实现验证码登录的笔记了!!!