基于vue-admin-template+SpringBoot+JWT实现登录

基于vue-admin-template+SpringBoot+JWT实现登录


1、实现的具体步骤如下图,可能会有版本差异,但是大致相同如果需要帮助可以联系我扣扣号(3421793724)
具体步骤
2、具体实现代码(有改动)上面图片使用的是固定的,没有和数据库进行连接,实现动态认证。
代码如下(后端):
第一步:引入依赖

<dependencies>
    <!-- JWT-->
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
    </dependency> 
</dependencies>

第二步:添加JWT工具类

public class JwtUtils {
 
    //常量
    public static final long EXPIRE = 1000 * 60 * 60 * 24; //token过期时间
    public static final String APP_SECRET = "ukc8BDbRigUDaY6pZFfWus2jZWLPHO"; //秘钥

    //生成token字符串的方法
    public static String getJwtToken(String id, String nickname){
 
        String JwtToken = Jwts.builder()
                .setHeaderParam("typ", "JWT")
                .setHeaderParam("alg", "HS256")
 
                .setSubject("guli-user")
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRE))
 
                .claim("id", id)  //设置token主体部分 ,存储用户信息
                .claim("nickname", nickname)
 
                .signWith(SignatureAlgorithm.HS256, APP_SECRET)
                .compact();
 
        return JwtToken;
    }
 
    /**
     * 判断token是否存在与有效
     * @param jwtToken
     * @return
     */
    public static boolean checkToken(String jwtToken) {
        if(StringUtils.isEmpty(jwtToken)) return false;
        try {
            Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
 
    /**
     * 判断token是否存在与有效
     * @param request
     * @return
     */
    public static boolean checkToken(HttpServletRequest request) {
        try {
            String jwtToken = request.getHeader("token");
            if(StringUtils.isEmpty(jwtToken)) return false;
            Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
 
    /**
     * 根据token字符串获取会员id
     * @param request
     * @return
     */
    public static String getMemberIdByJwtToken(HttpServletRequest request) {
        String jwtToken = request.getParameter("token");
        if(StringUtils.isEmpty(jwtToken)) return "";
        Jws<Claims> claimsJws = Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
        Claims claims = claimsJws.getBody();
        return (String)claims.get("id");
    }
}

第三步:登录代码逻辑实现
service(注意这里我使用的是mybatis-plus插件操作数据库的):

  /**
     * 登录逻辑处理
     * @param oUser
     * @return
     */
    @Override
    public R login(OUser oUser) {
        // 根据用户名,查询用户信息
        QueryWrapper<OUser> oUserQueryWrapper = new QueryWrapper<>();
        oUserQueryWrapper.eq("username",oUser.getUsername());
        OUser user = oUserMapper.selectOne(oUserQueryWrapper);

        // 1、是否有用户
        if(user == null) return R.error().data("用户不存在");

        // 2、判断用户名输入是否正确
         if(user.getUsername().equals(oUser.getUsername())){
             // 3、判断密码是否正确,正确则存放token
            if(user.getPassword().equals(oUser.getPassword())){
                Map map = new HashMap(16);
                map.put("token",JwtUtils.getJwtToken(user.getId(),user.getUsername()));
                return R.ok().data(map);
            }
            // 不正确,则提示错误信息
            else return R.error().data("密码错误");
        }

        // 不正确,则提示错误信息
        else  return R.error().data("用户名输入错误");
    }

第四步:登录控制器实现(这里的R是我统一响应实体的工具类,在第五步)

    /**
     * 使用JWT进行登录
     * @param oUser
     * @return
     */
    @PostMapping("login")
    public R login(@RequestBody OUser oUser) {
        return oUserService.login(oUser);
    }

第五步:工具类(可有,可无)

@Data
public class R<T> {

    private Boolean success;

    private Integer code;

    private String message;

    private T data;

    public void setCode(Integer code) {
        this.code = code;
    }

    //把构造方法私有
    private R() {}

    //成功静态方法
    public static R ok() {
        R r = new R();
        r.setSuccess(true);
        r.setCode(ResultCode.SUCCESS);
        r.setMessage("成功");
        return r;
    }

    //失败静态方法
    public static R error() {
        R r = new R();
        r.setSuccess(false);
        r.setCode(ResultCode.ERROR);
        r.setMessage("失败");
        return r;
    }

    public R success(Boolean success){
        this.setSuccess(success);
        return this;
    }

    public R message(String message){
        this.setMessage(message);
        return this;
    }

    public R code(Integer code){
        this.setCode(code);
        return this;
    }

    public R data(T t){
        this.setData(t);
        return this;
    }
}

第六步:获取登录信息(vue-admin-template)想要登录成功,他还会请求一个info方法,获取用户信息
1、service实现:

 /**
     * 获取用户信息逻辑处理
     * @param request 用来获取token
     * @return
     */
    @Override
    public R getInfo(HttpServletRequest request) {
        // 获取jwt解析的信息(用户的id)
        String memberIdByJwtToken = JwtUtils.getMemberIdByJwtToken(request);
        // 根据id,查询用户的信息,并将他放入data数据中
        OUser user = oUserMapper.selectById(memberIdByJwtToken);
        // 存储用户信息到响应体
        Map map = new HashMap<>();
        map.put("name",user.getUsername());
        map.put("avatar",user.getImage());
        return R.ok().data(map);
    }

2、控制器实现:

  /**
     * 解析JWT获取,用户信息
     * @return
     */
    @GetMapping("info")
    public R info(  HttpServletRequest request) {
        return oUserService.getInfo(request);
    }

源码:GitHub

更多文章

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值