配置Mysql与注册登录模块(中)
session与jwt
session验证
url包括公开的和需要权限的
登录,注册这种页面肯定是公开界面,大家都可以访问.
发送一个登录请求,将账号和密码发送到服务器,服务器接收数据去和数据库存储的账号密码数据进行比对,如果通过就向用户发送一个sessionid,用户会将这个sessionid保存到本地.以后用户登录的时候或者去访问一下授权页面的时候都会把这个sessionid发送到服务器,服务器将信息提取出来看此sessionid对应的user是否存在,如果存在,用户就可以正常对应的授权链接访问了(controller).
session不好用(不方便跨域)
目前常用的是jwt验证方式:
用户访问某个授权页面的时候,向服务器发送jwt-token,token携带着userid等和用户相关信息的字段发送给服务器,服务器将此字段后加一个秘钥字段.将这个字符串通过某种算法得到一个加密后的结果字符串(计算过程一般以当前的算力来看是不可逆的,逆向算出来可能需要几百年的时间).将携带userid等和用户相关信息的字段 + 加密结果字符串 拼接起来的jwt-token返回给用户.
这个jwt-token是将保存在用户端的可以用来未来的验证.
用户访问一些授权页面的时候将jwt-token发送到服务器,服务器验证jwt-token存在,存在就将user提取出来,接着访问controller
配置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的包,新建InfoService
、LoginService
、RegisterService
三个接口
实现/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