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.pswp.cn/news/212030.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/212030.shtml
英文地址,請注明出處:http://en.pswp.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語言寫的 就表…