欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringSecurity+Redis認(rèn)證過(guò)程小結(jié)

 更新時(shí)間:2022年01月05日 17:03:44   作者:ME_._ME  
這篇文章主要介紹了SpringSecurity+Redis認(rèn)證過(guò)程小結(jié),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

由于今天用Security進(jìn)行權(quán)限管理的時(shí)候出現(xiàn)了一些Bug,特此發(fā)這篇博客來(lái)補(bǔ)習(xí)一下對(duì)SpringSecurity的理解

前言引入

當(dāng)今市面上用于權(quán)限管理的流行的技術(shù)棧組合是

  • ssm+shrio
  • SpringCloud+SpringBoot+SpringSecurity

這種搭配自然有其搭配的特點(diǎn),由于SpringBoot的自動(dòng)注入配置原理,在創(chuàng)建項(xiàng)目時(shí)就自動(dòng)注入管理SpringSecurity的過(guò)濾器容器(DelegatingFilterProxy),而這個(gè)過(guò)濾器是整個(gè)SpringSercurity的核心。掌握著SpringSercurity整個(gè)權(quán)限認(rèn)證過(guò)程,而SpringBoot很香的幫你將其自動(dòng)注入了,而用ssm
去整合Security,將會(huì)耗用大量的配置文件,不易于開(kāi)發(fā),而Security的微服務(wù)權(quán)限方案,更是能和Cloud完美融合,于是Security比Shrio更強(qiáng)大,功能更齊全。

Security的核心配置文件

核心:Class SecurityConfig extends WebSecurityConfigurerAdapter

繼承了WebSecurityConfigurerAdapter后我們關(guān)注于configure方法對(duì)于在整個(gè)安全認(rèn)證的過(guò)程進(jìn)行相關(guān)的配置,當(dāng)然在配置之前我們先簡(jiǎn)單了解一下流程

簡(jiǎn)單的看了整個(gè)權(quán)限認(rèn)證的流程,很輕易的總結(jié)得出,SpringSecurity核心的就是以下幾種配置項(xiàng)了

  • 攔截器(Interceptor)
  • 過(guò)濾器(Filter)
  • 處理器(Handler,異常處理器,登錄成功處理器)

那我們就首先通過(guò)配置來(lái)完成認(rèn)證過(guò)程吧?。。?!

Security的認(rèn)證過(guò)程

假設(shè)我們要實(shí)現(xiàn)一下的認(rèn)證功能

1. 是登錄請(qǐng)求

  • 我們需要先判斷驗(yàn)證碼是否正確(驗(yàn)證碼過(guò)濾器,通過(guò)addFilerbefore實(shí)現(xiàn)前置攔截)
  • 再判斷用戶(hù)名密碼是否正確(使用自帶的用戶(hù)名密碼過(guò)濾器,UsernamePasswordAuthenticationFilter
  • 配置異常處理器(Handler)通過(guò)IO流將異常信息寫(xiě)出

關(guān)于密碼校驗(yàn)的流程:
UsernamePasswordAuthenticationFilter的密碼校驗(yàn)規(guī)則是基于AuthenticationManagerBuilder(認(rèn)證管理器)下的 UserDetailsService里的規(guī)則進(jìn)行驗(yàn)證的:
其中的核心方法:

1.public UserDetails *loadUserByUsername(String username)
通過(guò)請(qǐng)求參數(shù)的用戶(hù)名去數(shù)據(jù)庫(kù)查詢(xún)是否存在,存在則將其封裝在UserDetails里面,而驗(yàn)證過(guò)程是通過(guò)AuthenticationManagerBuilder獲取到UserDetail里的username和password來(lái)校驗(yàn)的,
這樣我們就可以通過(guò)

  • 配置yaml文件設(shè)置賬號(hào)密碼
  • 通過(guò)數(shù)據(jù)庫(kù)結(jié)合UserDetail來(lái)設(shè)置賬號(hào)密碼

(UserDetailsService中的方法,注意需要將UserDetailsService注入AuthenticationManagerBuilder中)

	@Override
	public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
		SysUser sysUser = sysUserService.getByUsername(username);
		if (sysUser == null) {
			throw new UsernameNotFoundException("用戶(hù)名或密碼不正確");
		}
		// 注意匹配參數(shù),前者是明文后者是暗紋
		System.out.println("是否正確"+bCryptPasswordEncoder.matches("111111",sysUser.getPassword()));
		return new AccountUser(sysUser.getId(), sysUser.getUsername(), sysUser.getPassword(), getUserAuthority(sysUser.getId()));
	}

通過(guò)了這個(gè)驗(yàn)證后,過(guò)濾器放行,不通過(guò)就用自定義或者默認(rèn)的處理器處理

核心配置文件:

package com.markerhub.config;

import com.markerhub.security.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

	@Autowired
	LoginFailureHandler loginFailureHandler;

	@Autowired
	LoginSuccessHandler loginSuccessHandler;

	@Autowired
	CaptchaFilter captchaFilter;

	@Autowired
	JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint;

	@Autowired
	JwtAccessDeniedHandler jwtAccessDeniedHandler;

	@Autowired
	UserDetailServiceImpl userDetailService;

	@Autowired
	JwtLogoutSuccessHandler jwtLogoutSuccessHandler;

	@Bean
	JwtAuthenticationFilter jwtAuthenticationFilter() throws Exception {
		JwtAuthenticationFilter jwtAuthenticationFilter = new JwtAuthenticationFilter(authenticationManager());
		return jwtAuthenticationFilter;
	}

	@Bean
	BCryptPasswordEncoder bCryptPasswordEncoder() {
		return new BCryptPasswordEncoder();
	}

	private static final String[] URL_WHITELIST = {

			"/login",
			"/logout",
			"/captcha",
			"/favicon.ico",

	};


	protected void configure(HttpSecurity http) throws Exception {

		http.cors().and().csrf().disable()

				// 登錄配置
				.formLogin()
				.successHandler(loginSuccessHandler)
				.failureHandler(loginFailureHandler)

				.and()
				.logout()
				.logoutSuccessHandler(jwtLogoutSuccessHandler)

				// 禁用session
				.and()
				.sessionManagement()
				.sessionCreationPolicy(SessionCreationPolicy.STATELESS)

				// 配置攔截規(guī)則
				.and()
				.authorizeRequests()
				.antMatchers(URL_WHITELIST).permitAll()
				.anyRequest().authenticated()

				// 異常處理器
				.and()
				.exceptionHandling()
				.authenticationEntryPoint(jwtAuthenticationEntryPoint)
				.accessDeniedHandler(jwtAccessDeniedHandler)

				// 配置自定義的過(guò)濾器
				.and()
				.addFilter(jwtAuthenticationFilter())
				.addFilterBefore(captchaFilter, UsernamePasswordAuthenticationFilter.class)

		;

	}

	@Override
	protected void configure(AuthenticationManagerBuilder auth) throws Exception {
		auth.userDetailsService(userDetailService);
	}
}

2. 不是登錄請(qǐng)求

  • 通過(guò)JwtfFilter來(lái)查看是否為登錄狀態(tài)

使用Redis整合時(shí)的注意事項(xiàng)

本質(zhì)上還是編寫(xiě)過(guò)濾器鏈:

  • 在登錄請(qǐng)求前添加過(guò)濾器
  • 注意驗(yàn)證碼存儲(chǔ)在redis的失效時(shí)間,如果超過(guò)失效時(shí)間將會(huì)被驗(yàn)證碼攔截器攔截下來(lái)
  • 需要準(zhǔn)備一個(gè)生成驗(yàn)證碼的接口,存儲(chǔ)在Redis中
  • 使用完驗(yàn)證碼需要將其刪除
// 校驗(yàn)驗(yàn)證碼邏輯
	private void validate(HttpServletRequest httpServletRequest) {

		String code = httpServletRequest.getParameter("code");
		String key = httpServletRequest.getParameter("token");

		if (StringUtils.isBlank(code) || StringUtils.isBlank(key)) {
			System.out.println("驗(yàn)證碼校驗(yàn)失敗2");
			throw new CaptchaException("驗(yàn)證碼錯(cuò)誤");
		}

		System.out.println("驗(yàn)證碼:"+redisUtil.hget(Const.CAPTCHA_KEY, key));
		if (!code.equals(redisUtil.hget(Const.CAPTCHA_KEY, key))) {
			System.out.println("驗(yàn)證碼校驗(yàn)失敗3");
			throw new CaptchaException("驗(yàn)證碼錯(cuò)誤");
		}

		// 一次性使用
		redisUtil.hdel(Const.CAPTCHA_KEY, key);
	}

到此這篇關(guān)于SpringSecurity+Redis認(rèn)證過(guò)程總結(jié)的文章就介紹到這了,更多相關(guān)SpringSecurity Redis認(rèn)證內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談javap命令拆解字節(jié)碼文件

    淺談javap命令拆解字節(jié)碼文件

    這篇文章主要介紹了拆解字節(jié)碼文件javap命令,對(duì)反編譯感興趣的同學(xué)可以參考下
    2021-04-04
  • MyBatis批量插入的五種方式

    MyBatis批量插入的五種方式

    這篇文章主要介紹了MyBatis批量插入的五種方式,每種方式結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-11-11
  • Java設(shè)計(jì)模式之備忘錄模式使用詳解

    Java設(shè)計(jì)模式之備忘錄模式使用詳解

    這篇文章主要介紹了Java設(shè)計(jì)模式中備忘錄模式的使用,備忘錄設(shè)計(jì)模式也叫作快照模式,主要用于實(shí)現(xiàn)防丟失、撤銷(xiāo)、恢復(fù)等功能,本文將通過(guò)示例為大家講解備忘錄模式的定義與使用,需要的同學(xué)可以參考一下
    2024-02-02
  • Java使用5個(gè)線(xiàn)程計(jì)算數(shù)組之和

    Java使用5個(gè)線(xiàn)程計(jì)算數(shù)組之和

    本文主要介紹了Java使用5個(gè)線(xiàn)程計(jì)算數(shù)組之和,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • IntelliJ IDEA設(shè)置JVM運(yùn)行參數(shù)的操作方法

    IntelliJ IDEA設(shè)置JVM運(yùn)行參數(shù)的操作方法

    這篇文章主要介紹了IntelliJ IDEA設(shè)置JVM運(yùn)行參數(shù)的操作方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-03-03
  • 詳解RocketMQ 消費(fèi)端如何監(jiān)聽(tīng)消息

    詳解RocketMQ 消費(fèi)端如何監(jiān)聽(tīng)消息

    這篇文章主要為大家介紹了RocketMQ 消費(fèi)端如何監(jiān)聽(tīng)消息示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Java?在?Array?和?Set?之間進(jìn)行轉(zhuǎn)換的示例

    Java?在?Array?和?Set?之間進(jìn)行轉(zhuǎn)換的示例

    這篇文章主要介紹了Java如何在Array和Set之間進(jìn)行轉(zhuǎn)換,在本文章中,我們對(duì)如何在?Java?中對(duì)Array和Set進(jìn)行轉(zhuǎn)換進(jìn)行一些說(shuō)明和示例,需要的朋友可以參考下
    2023-05-05
  • 聊聊@value注解和@ConfigurationProperties注解的使用

    聊聊@value注解和@ConfigurationProperties注解的使用

    這篇文章主要介紹了@value注解和@ConfigurationProperties注解的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java 基礎(chǔ)全面講解StringBuffer類(lèi)的使用

    Java 基礎(chǔ)全面講解StringBuffer類(lèi)的使用

    當(dāng)對(duì)字符串進(jìn)行修改的時(shí)候,需要使用 StringBuffer 和 StringBuilder類(lèi),和String類(lèi)不同的是,StringBuffer和 StringBuilder類(lèi)的對(duì)象能夠被多次的修改,并且不產(chǎn)生新的未使用對(duì)象
    2022-01-01
  • SpringCloud開(kāi)發(fā)課程查詢(xún)功能

    SpringCloud開(kāi)發(fā)課程查詢(xún)功能

    這篇文章主要介紹了SpringCloud開(kāi)發(fā)課程查詢(xún)功能,本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12

最新評(píng)論