SpringBoot项目实战-登录返回token(六)

1,406 阅读2分钟

因为项目是使用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在下期继续完善!!!