SpringBoot+vue前后端开发学习笔记3
数据库访问接口开发
这几天和另一个队友在忙后台接口的事,上次博客写到了借助JPA的findAll接口查询数据库中的所有信息。继续做数据库的增删改操作。
增加和修改都可以用jpa接口里面的save函数,如果传进去的数据对应的ID存在于原数据库中,则会进行保存,如果已存在,则会覆盖原数据达到修改的效果。所以这两个方法函数几乎是一样的。
对于删除则选择使用deletebyID的方法
登录认证与JWT初探
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).定义了一种简洁的,自包含的方法用于通信双方之间以JSON对象的形式安全的传递信息。因为数字签名的存在,这些信息是可信的,JWT可以使用HMAC算法或者是RSA的公私秘钥对进行签名。[1]
JWT的流程如下图所示
链接:https://www.jianshu.com/p/e88d3f8151db
目前我的理解就是任何用户再请求一些需要用户权限的功能之前都需要先进行登陆操作,传递用户名以及密码,后台通过查询数据库根据结果决定是否需要返回token,这里使用了加密算法进行加密,前端登陆成功的话就可以收到经过加密的token,在这之后每次访问都会将这个token返回给后端,直到用户退出。
具体实现
参考的github项目源码地址:https://github.com/JinBinPeng/springboot-jwt
核心代码userapi
用来判断用户输入的密码与账号是否吻合。并根据情况返还token
import com.myproject.springboottest.annotation.UserLoginToken;
import com.myproject.springboottest.entity.Student;
import com.myproject.springboottest.repository.StudentRepository;
import com.myproject.springboottest.service.TokenService;
import com.myproject.springboottest.service.UserService;
import org.json.JSONException;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api")
public class UserApi {
@Autowired
StudentRepository sture;
@Autowired
TokenService tokenService;
//登录
@PostMapping("/login")
public Object login(@RequestBody Student user) throws JSONException {
System.out.println("进入测试");
JSONObject jsonObject=new JSONObject();
System.out.println(user.toString());
Student userForBase=sture.findById(user.getStudent_id()).get();//get方法似乎不能获得空值
if(userForBase==null){
jsonObject.put("message","登录失败,用户不存在");
return jsonObject.toString();
}else {
if (!userForBase.getStudent_password().equals(user.getStudent_password())){
System.out.println("验证失败");
jsonObject.put("message","登录失败,密码错误");
return jsonObject.toString();
}else {
System.out.println("验证成功");
String token = tokenService.getToken(userForBase);
jsonObject.put("token", token);
jsonObject.put("user", userForBase);
return jsonObject.toString();
}
}
}
@UserLoginToken
@GetMapping("/getMessage")
public String getMessage(){
return "你已通过验证";
}
}
期间出现了jasonobject对象无法返回到前端,报错
因此我将返回值改为了jasonobject.toString,Springboot的特性会将返回值自动转化为Jason格式。
关键代码AuthenticationInterceptor
用来拦截请求查看有无token以决定是否提供服务。
public class AuthenticationInterceptor implements HandlerInterceptor {
@Autowired
UserService userService;
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object object) throws Exception {
String token = httpServletRequest.getHeader("token");// 从 http 请求头中取出 token
// 如果不是映射到方法直接通过
if(!(object instanceof HandlerMethod)){
return true;
}
HandlerMethod handlerMethod=(HandlerMethod)object;
Method method=handlerMethod.getMethod();
//检查是否有passtoken注释,有则跳过认证
if (method.isAnnotationPresent(PassToken.class)) {
PassToken passToken = method.getAnnotation(PassToken.class);
if (passToken.required()) {
return true;
}
}
//检查有没有需要用户权限的注解
if (method.isAnnotationPresent(UserLoginToken.class)) {
UserLoginToken userLoginToken = method.getAnnotation(UserLoginToken.class);
if (userLoginToken.required()) {
// 执行认证
if (token == null) {
throw new RuntimeException("无token,请重新登录");
}
// 获取 token 中的 user id
String userId;
try {
userId = JWT.decode(token).getAudience().get(0);
} catch (JWTDecodeException j) {
throw new RuntimeException("401");
}
Student user = userService.findUserById(userId);
if (user == null) {
throw new RuntimeException("用户不存在,请重新登录");
}
// 验证 token
JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(user.getStudent_password())).build();
try {
jwtVerifier.verify(token);
} catch (JWTVerificationException e) {
throw new RuntimeException("401");
}
return true;
}
}
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
在postman中进行测试
后台测试
将获得的token加入到请求的header里面
转换到getmessage获取信息
至此简单的处理逻辑搭建好了,但是仍有些错误需要整理,还要再打磨打磨
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/17794.html