redis+springsecurity+mybtais-plus+JWT

redis+springsecurity+mybtais-plus+JWT

01 引入依赖

       <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency>
<!--lombok依赖--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--    使用knife4j依赖 --><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>2.0.9</version></dependency><!-- jwt依赖--><dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.10.3</version></dependency><!--redis依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!--mybatisplus依赖--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency>
<!--        spring-security依赖--><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>

02 配置系统文件

#配置redis的端口和mybatis—plus的数据源,swagger的配置信息
spring:redis:host: 127.0.0.1port: 6379datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/text012?userSSL=false;serverTimezone=Asia/Shanghaiusername: rootpassword: 1234mvc:pathmatch:matching-strategy: ant_path_matcher
#开启驼峰转化,mapper的xml文件夹扫描      
mybatis-plus:config-locations: classpath:mapper/*.xmlconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

03 配置启动类

@SpringBootApplication
@MapperScan("com.example.demo.mapper")
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

04 重写UserDetailsService接口

@Service
public class UserDetailsServiceImpl implements UserDetailsService {//这是mybatis-plus所实现的数据操作层,不使用mybatis-plus就不写@Autowiredprivate MsUserServiceImp msUserServiceImp;@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {//使用mybatis-plus,获取到账号密码数据LambdaQueryWrapper<MsUser> qw=new LambdaQueryWrapper<>();qw.eq(MsUser::getUsername,username);MsUser user = msUserServiceImp.getOne(qw);//下一步就是重写UserDetails接口LoginUser loginUser = new LoginUser();loginUser.setMsUser(user);return loginUser;}
}

05 重写UserDetails接口

//前三个是lombok的模块化配置,第四个是redis的序列化配置
@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class LoginUser implements UserDetails {//首先要写一个与数据库内表对应的实体类private MsUser msUser;//重写审核方法@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {return null;}//返回实体类MsUser中Password(密码)和Username(账号名对应的属性),将判断方法的返回值都改为true@Overridepublic String getPassword() {return msUser.getPassword();}@Overridepublic String getUsername() {return msUser.getUsername();}@Overridepublic boolean isAccountNonExpired() {return true;}@Overridepublic boolean isAccountNonLocked() {return true;}@Overridepublic boolean isCredentialsNonExpired() {return true;}@Overridepublic boolean isEnabled() {return true;}
}

四个关键点

1.UserDetails接口的实现类需要一个实体类属性(类似MsUser)
2.getPassword和getUsername方法需要返回实体类(MsUser)中代表账号名和密码的属性的值
3.五个判断账号使用的情况的方法需要返回true,不然无法正常使用

06 重写springSecurity的配置类

  • 实现WebSecurityConfigurerAdapter接口
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {//需要自定义JWT过滤器@Autowiredprivate JWTFilter jwtFilter;//设置密码的加密方式@Beanpublic PasswordEncoder passwordEncoder(){return new BCryptPasswordEncoder();}//关闭原有的登录接口和页面,后端只完成接口即可,让前端去画登录界面@Overrideprotected void configure(HttpSecurity http) throws Exception {http// 将自己定义的过滤器加到UsernamePasswordAuthenticationFilter之前.addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class);http//关闭csrf.csrf().disable()//不通过Session获取SecurityContext.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().authorizeRequests()// 对于登录接口 允许匿名访问.antMatchers("/msUser/login").anonymous()// 除上面外的所有请求全部需要鉴权认证.anyRequest().authenticated();}//顺便设置JWT的token验证方式,这里我没重写,使用springsecurity原有的实现方式@Override@Beanpublic AuthenticationManager authenticationManagerBean() throws Exception {return super.authenticationManagerBean();}
}

五个关键点

1.自定义JWT过滤器
2.设置密码的加密方式
3.addFilterBefore,把自定义的JWT的过滤器加到UsernamePasswordAuthenticationFilter过滤器前
4.关闭csrf(原有的登录界面和接口)
5.设置JWT的token验证方式

07 写登录实现类

  • 我这里采用mybatis-plus实现从数据库获取数据,其他方式也可
@Service
public class MsUserServiceImp extends ServiceImpl<MsUserMapper, MsUser>implements IMsUserService {//注入AuthenticationManager对象@Autowiredprivate AuthenticationManager authenticationManager;//写一个用于使用Redis工具类@Autowiredprivate RedisUtil redisUtil;//AjaxResult是我用于设置返回的工具类,不重要@Overridepublic AjaxResult login(MsUser user) {//token的验证UsernamePasswordAuthenticationToken token=new UsernamePasswordAuthenticationToken(user.getUsername(),user.getPassword());Authentication authentication=authenticationManager.authenticate(token);if (Objects.isNull(authentication)){throw new RuntimeException("认证失败");}//合格说明通过LoginUser loginUser=(LoginUser) authentication.getPrincipal();//使用JWT创建token,这里我封装了一个JWT的工具类String jwt= JWTUtil.createToken(loginUser.getMsUser());try {redisUtil.setCacheObject("user:"+loginUser.getMsUser().getUserId(),loginUser);}catch (Exception e){e.printStackTrace();}return AjaxResult.success("登录成功",jwt);}
}

三个关键点

1.调用springsecurity的工具类验证前端参数
2.使用JWT工具类生成token
3.redis的数据储存

08 测试

@RestController
@RequestMapping("/msUser")
public class MsUserController {@Autowiredprivate MsUserServiceImp userServiceImp;@PostMapping("/login")public AjaxResult<String> login(MsUser user) {System.out.println(user);return userServiceImp.login(user);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/212030.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

12.视图

目录 1.视图的含义与作用 2.视图的创建与查看 1.创建视图的语法形式 2、查看视图&#xff1a; 1.使用DESCRIBE语句查看视图基本信息 2.使用SHOW TABLE STATUS语查看视图基本信息查看视图的信息 3.使用SHOW CREATE VIEW语查看视图详细信息 4.在views表中查看视图详细信息…

【DP】Yarik and Array—CF1899C

Yarik and Array—CF1899C 一道不难的DP&#xff0c;根据代码就能看出思路。 C o d e Code Code #include <bits/stdc.h> #define int long long #define sz(a) ((int)a.size()) #define all(a) a.begin(), a.end() using namespace std; using PII pair<int, int&…

codeforces

分析 删去 k k k 个之后要是回文串&#xff0c;不过题目会给字符串rearrange&#xff0c;所以对于奇数个数的字符最多留一个&#xff0c;偶数的不用管。 Think Twice, Code Once #include<bits/stdc.h> #define il inline #define get getchar #define put putchar #…

SAP-PP:PP模块新手顾问入门寻找解决方案途径

在学习PP模块时我们可以参考一下部分资源: SAP Help SAP Help SAP 帮助门户是了解任何功能基础知识的起点。在这里&#xff0c;您将了解每个功能可以做什么&#xff0c;以及如何使用每个功能的一些基本示例 F1 Help 每个事务中的每个字段都有自己的文档&#xff0c;您可以通过…

案例015:基于微信小程序的校园防疫系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

wangzherongyao milaidi

王者荣耀米莱狄&#xff0c; 1&#xff09;大多数人知道的是这个英雄很能拆塔&#xff0c; 2&#xff09;他也有个致命缺陷&#xff0c;当对面有前排&#xff0c;同样拆塔的时候&#xff0c;他也清不动线&#xff0c;而且对于前排来说他的爆发力远没有安其拉等爆发型顺伤秒伤…

论文阅读_反思模型_Reflexion

英文名称: Reflexion: Language Agents with Verbal Reinforcement Learning 中文名称: 反思&#xff1a;具有言语强化学习的语言智能体 文章: http://arxiv.org/abs/2303.11366 代码: https://github.com/noahshinn/reflexion 作者: Noah Shinn (Northeastern University) 日期…

docker 一键寻找容器在服务器存储位置

docker ps -a找到容器id/容器名称 docker inspect 容器id/容器名称 | grep UpperDir找出该容器在物理机的位置 inspect作用:查看docker详细信息 cd到UpperDir所指向的地址&#xff0c;找到配置文件并修改,到这后,这个位置和你用exec命令进入容器内看到文件是一致的

AtCoder Beginner Contest 328

A - Not Too Hard (atcoder.jp) AC代码: #include<bits/stdc.h> #define endl \n //#define int long long using namespace std; const int N10; int s[N]; int n,x; void solve() {cin>>n>>x;for(int i1;i<n;i) cin>>s[i];int ans0;for(int i1;…

go-zero 开发之安装 etcd

本文只涉及 Linux 上的安装。 二进制安装 下载二进制安装包 #ETCD_VERv3.4.28 ETCD_VERv3.5.10 DOWNLOAD_URLhttps://github.com/etcd-io/etcd/releases/download INSTALL_DIR/tmprm -f ${INSTALL_DIR}/etcd-${ETCD_VER}-linux-amd64.tar.gz rm -rf ${INSTALL_DIR}/etcd-dow…

反汇编语言区分函数和运算符

在汇编语言中&#xff0c;函数和运算符可以通过一些特定的指令和约定来区分。 函数&#xff1a; 函数通常由一系列指令组成&#xff0c;用于执行特定的任务或操作。函数通常具有入口点和出口点&#xff0c;分别表示函数的开始和结束位置。函数通常包含参数传递、局部变量的分配…

windows错误事件 98、41、7000、55、153解决办法

事件错误&#xff1a;98、55、153 疑难解答清单 在系统事件日志中&#xff0c;搜索新技术文件系统 (NTFS) 和磁盘相关的警告和错误。 例如&#xff0c;事件 ID 55、153 或 98。 管理员身份打开CMD&#xff0c;运行命令 chkdsk /scan 并检查结果。 该 chkdsk /scan 命令是只读…

字符串详解+代码分析

目录 1. 字符与整数的联系——ASCII码每个常用字符都对应一个-128 ~ 127的数字&#xff0c;二者之间可以相互转化。注意&#xff1a;目前负数没有与之对应的字符。 2.字符数组 2.2 字符数组的常用操作下面几个函数需要引入头文件: 2.3 遍历字符数组中的字符&#xff1a; 3.…

ICMP协议以及报文讲解(ICMP查询报文、ICMP差错报文)

目录 ICMP协议 ICMP报文格式 ICMP回显请求/应答报文 ICMP差错报文 ICMP 宿主机不可达差错报文 ICMP 重定向差错报文 ICMP TTL超时差错报文 ICMP协议 ICMP协议的作用 ICMP&#xff08;Internet Control massage protocol&#xff09;因特网控制协议&#xff0c;主要用来…

C语言再学习 -- 单精度(float)和双精度(double)浮点数 与 十六进制(HEX) 之间转换(转载))

之前讲过浮点数部分&#xff0c;参看&#xff1a;C语言再学习 – 浮点数 现在程序中要将浮点数&#xff0c;通过TCP发送。那得先将其转换为十六进制才行呀。 那么问题就来了。 参看&#xff1a;C语言&#xff1a;单精度(float)和双精度(double)浮点数 与 十六进制(HEX) 之间…

(JAVA)-打印流

打印流是高级流&#xff0c;只能写不能读&#xff0c;只有输出流 只操作文件目的地&#xff0c;不操作数据源 能实现数据的原样输出 printStream:字节打印流 构造方法&#xff1a; 用文件或地址的方式创建字节打印流也会创建一个字节基本流。 字节流底层没有缓存区&#xff…

文档或书籍扫描为 PDF:ScanPapyrus Crack

ScanPapyrus 可让您快速轻松地将文档或书籍扫描为 PDF&#xff0c;批处理模式使扫描过程快速高效&#xff0c;自动处理书籍并将其拆分为单独的页面 用于快速扫描文档、书籍或打印照片的扫描仪软件 快速扫描文档 使用此扫描仪软件&#xff0c;您无需在扫描仪和计算机之间来回移动…

SpringBoot 官方脚手架不再支持Java8和Java11

Spring 官方脚手架不再支持初始化 Java8 和 Java 11 项目&#xff0c;目前仅支持初始化Java17 和 Java21 项目。 阿里巴巴Spring脚手架支持初始化Java8、Java11、Java17、Java19 的项目&#xff0c;不支持初始化Java21的项目。

Torn Lucky Ticket

题目 #include<bits/stdc.h> using namespace std; #define int long long const int maxn 1e6 5, d 500; vector<string> vec[6]; int mp[1005]; signed main(){int n;cin >> n;for(int i 1; i < n; i){string s;cin >> s;int len s.size();…

java简述springboot内置数据库 并举例启动h2内存数据环境

在前面 我们讲了 springboot 给我们提供了 默认的 数据源 默认 HikariCP 以及其他两种内置数据源 持久化技术 JdbcTemplate 那么 说起来很多人难以置信 不过 springboot 也真的给我们内置了数据库技术 而且不止一种 是三种 这三个数据库的特点在于 它们都是用java语言写的 就表…