Kob_配置Mysql与注册登录模块(中)

配置Mysql与注册登录模块(中)

session与jwt

session与jwt验证

配置springboot

Maven仓库地址
依赖添加

jjwt-api
jjwt-impl
jjwt-jackson

添加到pom.xml后重新加载一下Maven

JwtUtil类:
https://www.acwing.com/blog/content/23255/添加一个JwtUtil类(可以放在backend下新建一个utils文件夹里)

JwtAuthenticationTokenFilter类:(验证jwt-token是否合法,合法就将user提取到上下文中)
https://www.acwing.com/blog/content/23256/

config.SecurityConfig类:
https://www.acwing.com/blog/content/23257/

数据库修改

让id自增
photo存的是头像的链接,可以将图片存到云服务器云盘上,或者图床上.

pojo和数据库是对应的,所以应该在pojo的User类中加上一个photo域(private String photo;),id自增也要加一个注解@TableId(type=IdType.AUTO)

编写api

springboot写api的三个步骤

1.service中写一个接口
2.写service的impl 中写接口的实现
3.写controller (用来调用service的接口)

可以按包来实现,比如现在实现的是user模块的功能,就可以在service中新建一个user包,这里写的是和账户有关的功能就可以再在user包中新建一个account的包,新建InfoServiceLoginServiceRegisterService三个接口

实现/user/account/token/:验证用户名密码,验证成功后返回jwt token(令牌)

(此api应该是公开的)
根据用户名和密码获取一个jwt-token

1.service中新建一个user包中再新建一个account包,新建一个LoginService接口

package com.kob.backend.service.user.account;

import java.util.Map;

public interface LoginService {
    public Map<String,String> getToken(String username, String password);
}

2.impl中的user的account里实现一个LoginServiceImpl接口

package com.kob.backend.service.impl.user.account;

import com.kob.backend.pojo.User;
import com.kob.backend.service.impl.utils.UserDetailsImpl;
import com.kob.backend.service.user.account.LoginService;
import com.kob.backend.utils.JwtUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Service;

import java.net.Authenticator;
import java.util.HashMap;
import java.util.Map;

@Service
public class LoginServiceImpl implements LoginService {

    @Autowired
    private AuthenticationManager authenticationManager; // 验证用户登录的一个api

    // alt + insert 选择实现方法
    @Override
    public Map<String, String> getToken(String username, String password) {
        UsernamePasswordAuthenticationToken authenticationToken =
                new UsernamePasswordAuthenticationToken(username,password);

        Authentication authenticate = authenticationManager.authenticate(authenticationToken); // 登录失败会自动处理

        UserDetailsImpl loginUser = (UserDetailsImpl) authenticate.getPrincipal();
        User user = loginUser.getUser(); // 到这里就把用户名取出来了

        String jwt = JwtUtil.createJWT(user.getId().toString());

        Map<String,String> map = new HashMap<>();
        map.put("error_massage","success");
        map.put("token",jwt); // 这里返回的jwttoken不是加密的结果,是bs64编码后的结果,可以通过jwt.io这个网址来解析(调试的时候可能用到)

        return null;
    }
}

3.写Controller(调用刚刚的service接口)

package com.kob.backend.controller.user.account;

import com.kob.backend.service.user.account.LoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

@RestController
public class LoginController {
    @Autowired
    private LoginService loginService;

    @PostMapping("/user/account/token/")
    public Map<String,String> getToken(@RequestParam Map<String,String> map){
        String username = map.get("username");
        String password = map.get("password");
        return loginService.getToken(username,password);
    }
}
调试

因为是写的时候用的是post请求,所以在前端代码里调试

在vue里调试,本项目的App.vue中用ajax调试

实现/user/account/info/:根据令牌返回用户信息

根据jwt-token向服务器发送请求获取此用户的一些用户信息

实现/user/account/register/:注册账号

(此api是公开的)
用户注册账号的url

posted @ 2024-02-20 10:56  r涤生  阅读(11)  评论(0编辑  收藏  举报