------------恢复内容开始------------
现在我们写退出功能,退出功能比较简单,因为前端来处理退出功能,后端返回一个退出成功的接口就可以。
如何去返回呢。如下所示:
@ApiOperation(value = "退出登录")
@PostMapping("/logout")
public RespBean loginout(){
return RespBean.sucess("注销成功");
}
登录之后返回token,前端会把token放在请求头里面,访问任何接口的时候都会携带这个token令牌,后端会写一个拦截器去判断这个Token是否合法有效。如果是合法有效的才能访问接口,如果是非法的则不让访问,后端需要和前端定义好,后端调用退出登录的接口,前端拿到后端返回的200的状态码之后,前端就需要直接在请求头中把这个token删除,这时候,前端再调用后端的接口就会被拦截器拦截,不再能访问其他的接口了。这样就可以完成我们退出登录的处理了。
这里使用了前后端分离,所以用法比较简单。
现在我们再写获取当前登录用户的信息这个接口。该接口返回的肯定是一个admin类的对象。
写一个getAdminInfo方法。这个方法的参数使用Principal这个类,该类可以直接获取到当前登录用户的对象,因为上面的步骤中我们已经把当前登录用户的信息存储到springsecrity中。
过程如下:
1.先判断principal是否为空,若为空,则表示还有问题。
2.通过principal的getName方法,这里的getName就是用户名。
3.然后使用getAdminByUsername获取admin对象。
4.获取之后,我们就可以把admin返回了,但是提前我们需要把password设置为空。
5.返回admin。
/**
* 写一个连接器判断token的值是否是合法有效的
* @return
*/
@ApiOperation(value = "获取当前登录用户信息")
@GetMapping("admin/info")
public Admin getAdminInfo(Principal principal){
if (null == principal){
return null;
}
String username = principal.getName();
Admin admin = adminService.getAdminByUserName(username);
admin.setPassword(null);
return admin;
}
这里的方法getAdminByUserName().此方法需要我们进行补充完整
现在AdminService接口中撰写方法,
public interface IAdminService extends IService<Admin> {
/**
* 登录之后返回token
* @param username
* @param password
* @param request
* @return
*/
RespBean login(String username, String password, HttpServletRequest request);
/**
* 根据用户名获取用户
* @param username
* @return
*/
Admin getAdminByUserName(String username);
}
再将接口在AdminServiceImpl中进行实现。
首先我们需要将AdminMapper 进行注入
@Autowired
private AdminMapper adminMapper;
之前我们在使用mybatis实现getAdminByUserName这个方法的时候,是需要调用我们的mapper层是写对应接口的方法,然后再去写SQL语句。而现在使用的mybatisplus。我们就可以使用selectOne()这个方法。
该方法的参数是一个查询实体QueryWrapper该查询实体的泛型是Admin。然后使用 .eq()方法,这里的eq是equal的缩写,代表等于,然后参数一是需要查询的表的列名(属性)。这里是“username”,参数二是这个属性对应的值。这里也是username。
到了这里,我们后面还可以使用链式变成不停的往下进行点。我们再调用.eq()方法,来判断当前的用户是否被禁用,传入的属性是"enabled",属性对应值为true。
/**
* 根据用户名获取用户
* @param username
* @return
*/
@Override
public Admin getAdminByUserName(String username) {
return adminMapper.selectOne(new QueryWrapper<Admin>().eq("username",username).eq("enabled",true));
}
这里我们Login登录之后做的事情就完成的差不多了,首先登录之后返回token令牌,然后获取登录用户的信息,最后是退出登录。
目前登录的功能基本上完成,但是可以发现还有自动注入的 AdminMapper和PasswordEncoder这2个类是爆红的状态,AdminMapper爆红的原因是Idea本身的问题, PasswordEncoder爆红是因为还没配置。
总结:
我们来总结一下流程:
首先,前端传入用户名和密码,因为前端只传输用户名和密码,那我就不需要其他的信息,所以我们单独建立一个实体类AdminLoginParam来专门接受用户名和密码,用admin好也可以接受用户名和密码,只是对象太大了。除了ID用户名和密码,还有好多其他的属性,所以我们单独的新建了一个类。如果有拓展的话,后面我们还可以进行拓展。
当前端传给我们用户名和密码,后端会先进行登录,登录用的是springsecurity自带的UserDetailService里面的LoadUserByUserName这个方法,登录成功之后就返回Token,登录不成功则提示重新登录,登录成功,前端会将token值放在请求的请求头中。那之后的每一次请求都会携带这个请求头。这时候后端要准备一个拦截器,当前端发送了请求后要去判断token的值是否是有效的,若无效则表示当前用户可能没有登录,或者当前的tokjen已经失效了。我们这里的退出登录也比较简单,直接访问退出登录接口,返回给前端一个200的状态码,当前端接受到200的状态码之后,则将请求头中的token值给删除掉。后面再访问登录接口,因为没有了Token则会被拦截器进行拦截。
最后一个是获取当前登录用户对象,我门使用的Principal这个类,使用这个类的前提是我们在登录的时候,需要在springsecurity的全局中更新authenticationToken。这个在上面提到过。
------------恢复内容结束------------
浙公网安备 33010602011771号