首页 > 数据库 >Kob_配置Mysql与注册登录模块(中)

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

时间:2024-02-20 11:00:49浏览次数:32  
标签:account Kob jwt token user 模块 Mysql import com

配置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的包,新建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

标签:account,Kob,jwt,token,user,模块,Mysql,import,com
From: https://www.cnblogs.com/rdisheng/p/16544048.html

相关文章

  • MySQL 零碎笔记2
    1.分区表适用场景:业务简单,单表查询,且都跟时间范围查询相关。数据需要定期清理数据,无需保留全部数据。数据更新频率较低,只有写入操作。优点:查询条件包含分区条件时,可以直接扫描必要的分区。也可以直接指定必要的分区来提高查询效率。聚合查询时,可以很容易地在每个分区上并行......
  • odoo安装模块报错& 更新postgresql数据库
    在本地win11环境下部署了一个odoo17,一开始还好好的,运行几次之后,每次登录就会报错,安装模块时也会报错。一开始,服务器的报错信息提示keyerror:mail.... 个人判断应该是缺少模块,在尝试安装了邮件营销的模块后恢复正常。但是随后尝试别的模块时又开始报错。网页前端和服务......
  • 一例MySQL的insert死锁
    原文链接:https://fanyilun.me/2022/03/09/%E4%B8%80%E4%BE%8BMySQL%E7%9A%84insert%E6%AD%BB%E9%94%81/ 分享一个最近遇到的一例MySQL死锁。关于MySQL的锁,几年前写过一篇原理类的文章,基础知识建议移步MySQL加锁分析。背景  我们使用MySQL实现了一个通用的分布式DB锁,建表语句......
  • Mysql中使用rule作为表的别名引发的语法错误
    不可以使用rule作为别名MySQL表别名不能为"rule",因为"rule"是MySQL的保留关键字。你可以使用其他名称作为别名,例如:SELECT*FROMyour_tableASrule;将"your_table"替换为你的表名,将"rule"替换为你想要的别名。"rule"是MySQL的保留关键字吗在MySQL中,“rule”作为保留关键......
  • GaussDB(for MySQL) Serverless全面商用:无感弹性,极致性价比
    本文分享自华为云社区《GaussDB(forMySQL)Serverless全面商用:无感弹性,极致性价比》,作者:GaussDB数据库。技术背景对于现代企业级IT系统,数据库往往是作为底座一般的存在,数据库的稳定性、可靠性如果难以保障,整个系统的平稳运行将无从谈起。出于如上考量,在部署数据库资源时,客户......
  • Python异步编程原理篇之IO多路复用模块selector
    selector简介selector是一个实现了IO复用模型的python包,实现了IO多路复用模型的select、poll和epoll等函数。它允许程序同时监听多个文件描述符(例如套接字),并在其中任何一个就绪时进行相应的操作。这样可以有效地管理并发I/O操作,提高程序的性能和资源利用率。本篇主要......
  • Python Paramiko模块-exec_command() 和 invoke_shell() 两种操作方式
    前言Paramiko是Python语言的一个SSH客户端。可以远程连接Linux服务器,通过python对Linux进行操作,可以实现进行对远程服务器进行下载和上传文件操作。exec_command()操作importparamikossh=paramiko.SSHClient()ssh.set_missing_host_key_policy(paramiko.AutoAd......
  • 基于python+mysql的宠物领养网站系统
    功能介绍平台采用B/S结构,后端采用主流的Python语言进行开发,前端采用主流的Vue.js进行开发。整个平台包括前台和后台两个部分。前台功能包括:首页、宠物详情页、用户中心模块。后台功能包括:总览、领养管理、宠物管理、分类管理、标签管理、评论管理、用户管理、运营管理、日志......
  • MySQL死锁日志
    MySQL死锁日志MySQL的死锁可以通过showengineinnodbstatus\G;来查看,最近的死锁信息在LATESTDETECTEDDEADLOCK下面。但是这种方式只能显示最新的一条死锁信息,该方式无法完全捕获到系统发生的死锁信息。MySQL系统内部提供一个innodb_print_all_deadlocks参数,该参数默......
  • MySQL死锁日志的查看和分析
    MySQL死锁日志的查看和分析 目录一,关于MySQL的死锁二,人造一个死锁的场景三,查看最近一次死锁的日志四,死锁日志的内容1,事务1信息2,事务1持有的锁3,事务1正在等待的锁4,事务2信息5,事务2正在持有的锁6,事务2正在等待的锁7,死锁处理结果五,关于mysql的八种锁1,行锁(RecordL......