因为项目是使用spring security框架和jwt去生成token的,所以一般项目中会在admin中实现UserDetail
因为用户登录时,只需要账号密码,所以可以另外写一个实体类AdminLoginParam
写接口的步骤先写controller->service->service.impl->mapper,意思是,控制层创建对外使用的接口所需的方法,在service层实现逻辑,支撑服务层逻辑的数据从mapper层拿,也就是操作数据库层在mapper
第一步:在controller中创建LoginController:
public class LoginController {
@Autowired
private IAdminService adminService;
@ApiOperation(value = "登录之后返回token")
@PostMapping("/login")
public RespBean login(AdminLoginParam adminLoginParam, HttpServletRequest request){//这里需要拿到用户传过来的AdminLoginParam实体信息和,HttpServletRequest
return adminService.login(adminLoginParam.getUsername(),adminLoginParam.getPassword(),request);
}
}
第二步就要在service,也就是服务层创建控制层所需的login方法了:
public interface IAdminService extends IService<Admin> {
/**
* 登录之后返回token
* @param username
* @param password
* @param request
* @return
*/
RespBean login(String username, String password, HttpServletRequest request);
}
第三步要在实现类中,也就是在service.impl包下的类的AdminServiceImpl实现这个方法:
@Service
public class AdminServiceImpl extends ServiceImpl<AdminMapper, Admin> implements IAdminService {
@Autowired
private UserDetailsService userDetailsService;
@Autowired
private PasswordEncoder passwordEncoder;
@Autowired
private JwtTokenUtil jwtTokenUtil;
@Value("${Jwt.tokenHead}")
private String tokenHead;
/**
* 登录之后返回token
* 因为登录需要使用UserDetailsService中的loadUserByUsername,所以需要引入。
* 因为匹配用户密码时需要使用PasswordEncoder,security是使用PasswordEncoder工具加密工具的,所以需要引入
* @param username
* @param password
* @param request
* @return
*/
@Override
public RespBean login(String username, String password, HttpServletRequest request) {
//登录
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);
}
}
代码用了很多之前封装好的工具类,所以需要注意一一下,往期代码,这期中的passwordEncoder在下期继续完善!!!