>  기사  >  데이터 베이스  >  SpringSecurity+Redis 인증 프로세스는 무엇입니까?

SpringSecurity+Redis 인증 프로세스는 무엇입니까?

王林
王林앞으로
2023-06-03 15:22:20969검색

소개 소개

현재 시장에서 인기 있는 권한 관리 기술 스택 조합은

  • ssm+shrio

  • SpringCloud+SpringBoot+SpringSecurity

SpringSecurity+Redis 인증 프로세스는 무엇입니까?

이 조합은 자연스럽게 고유한 일치를 갖습니다. 특징: SpringBoot의 자동 주입 구성 원리로 인해 프로젝트 생성 시 SpringSecurity를 ​​관리하는 필터 컨테이너(DelegatingFilterProxy)가 자동으로 주입되며, 이 필터가 전체 SpringSecurity의 핵심입니다. SpringSecurity의 전체 권한 인증 프로세스를 마스터하고 SpringBoot를 사용하면 자동으로 주입할 수 있습니다 ssm을 사용하여 Security를 ​​통합하면 많은 구성 파일이 소모되고 개발이 쉽지 않으며 Security의 마이크로서비스 권한과 완벽하게 통합될 수 있습니다. 클라우드이므로 보안은 Shrio보다 더 강력하고 완벽합니다.
Security의 핵심 구성 파일

Core:

SecurityConfig

클래스는 WebSecurityConfigurerAdapterWebSecurityConfigurerAdapter를 상속받은 후 전체 보안 인증 과정에서 관련 구성에 대한 구성 방법에 중점을 둡니다. 물론 먼저 간략하게 이해해야 합니다. 구성 과정을 살펴보세요

전체 권한 인증 과정을 간략하게 살펴보면 Spring Security의 핵심은 다음 구성 항목

    Interceptor
  • Filter
  • 이라고 쉽게 결론을 내릴 수 있습니다. 핸들러(핸들러, 예외 핸들러, 로그인 성공 핸들러)
그럼 먼저 설정을 통한 인증 과정을 완료해 볼까요! ! ! !

보안 인증 과정

다음과 같은 인증 기능을 구현한다고 가정해보자

1. 로그인 요청입니다

    먼저 인증 코드가 맞는지 확인해야 합니다(인증 코드 필터, 사전 차단을 통해) addFilerbefore)
  • 그런 다음 사용자 이름과 비밀번호가 올바른지 확인합니다(내장된 사용자 이름 및 비밀번호 필터인
  • UsernamePasswordAuthenticationFilter

    사용)

  • IO를 통해 예외 정보를 작성하도록 예외 처리기(Handler)를 구성합니다. 스트림
  • 비밀번호 확인 프로세스 정보:
UsernamePasswordAuthenticationFilter의 비밀번호 확인 규칙은 AuthenticationManagerBuilder(인증 관리자) 아래 UserDetailsService의 규칙을 기반으로 확인됩니다.

핵심 방법:

1.public

UserDetails

*loadUserByUsername(문자열 사용자 이름) 요청 매개변수의 사용자 이름을 통해 존재 여부를 쿼리하기 위해 데이터베이스로 이동합니다. 존재하는 경우 UserDetails에 캡슐화됩니다. 인증 프로세스는 AuthenticationManagerBuilder를 통해 UserDetail에서 확인됩니다.

계정 비밀번호를 설정하도록 yaml 파일을 구성하세요
  • UserDetail
  • 과 결합된 데이터베이스를 통해 계정 비밀번호를 설정하세요(UserDetailsService의 메서드, UserDetailsService를 AuthenticationManagerBuilder에 삽입해야 한다는 점에 유의하세요)
  • 	@Override
    	public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    		SysUser sysUser = sysUserService.getByUsername(username);
    		if (sysUser == null) {
    			throw new UsernameNotFoundException("用户名或密码不正确");
    		}
    		// 注意匹配参数,前者是明文后者是暗纹
    		System.out.println("是否正确"+bCryptPasswordEncoder.matches("111111",sysUser.getPassword()));
    		return new AccountUser(sysUser.getId(), sysUser.getUsername(), sysUser.getPassword(), getUserAuthority(sysUser.getId()));
    	}
이 검증을 통과하면 필터가 해제됩니다. 통과하지 못하면 맞춤 또는 기본 프로세서를 사용하여 처리하세요

핵심 구성 파일:

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)

				// 配置拦截规则
				.and()
				.authorizeRequests()
				.antMatchers(URL_WHITELIST).permitAll()
				.anyRequest().authenticated()

				// 异常处理器
				.and()
				.exceptionHandling()
				.authenticationEntryPoint(jwtAuthenticationEntryPoint)
				.accessDeniedHandler(jwtAccessDeniedHandler)

				// 配置自定义的过滤器
				.and()
				.addFilter(jwtAuthenticationFilter())
				.addFilterBefore(captchaFilter, UsernamePasswordAuthenticationFilter.class)

		;

	}

	@Override
	protected void configure(AuthenticationManagerBuilder auth) throws Exception {
		auth.userDetailsService(userDetailService);
	}
}
2. 로그인 요청이 아닙니다

JwtfFilter를 사용하여 로그인되어 있는지 확인하세요
  • Redis 통합 사용 시 참고하세요. Redis에 저장된 인증코드의 만료시간이 초과되면 인증코드 인터셉터에 의해 차단됩니다

인증코드 생성을 위한 인터페이스를 준비하고 Redis에 저장해야 합니다

  • 인증코드 사용 후 삭제해야해요

  • // 校验验证码逻辑
    	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("验证码校验失败2");
    			throw new CaptchaException("验证码错误");
    		}
    
    		System.out.println("验证码:"+redisUtil.hget(Const.CAPTCHA_KEY, key));
    		if (!code.equals(redisUtil.hget(Const.CAPTCHA_KEY, key))) {
    			System.out.println("验证码校验失败3");
    			throw new CaptchaException("验证码错误");
    		}
    
    		// 一次性使用
    		redisUtil.hdel(Const.CAPTCHA_KEY, key);
    	}

위 내용은 SpringSecurity+Redis 인증 프로세스는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제