Springsecurity 기본 사항
이전 기사에서 "SpringBoot + Spring Security 및 개인화 된 로그인 구성의 기본 사용"에서 Springsecurity가 간단히 소개되어 기본적으로 인터페이스를 소개하고 기능을 구현했습니다. 이 기사는 소스 코드 관점에서 사용자 인증 프로세스에 대한 간단한 분석을 시도합니다.
특정 분석 전에 먼저 Springsecurity의 일반적인 원칙을 볼 수 있습니다.
Springsecurity 기본 사항
실제로, 그것은 주로 일련의 필터를 통해 비교적 간단합니다. 요청을 가로 채고 처리합니다.
인증 처리 프로세스 설명
UsernamePasswordAuthenticationFilter 클래스를 직접 살펴 보겠습니다.
Public Class usernamepasswordauthenticationFilter는 AbstractAuthenticationProcessingFilter // 인증 요청을 요청하기 위해 로그인 (httpservletrequest 요청, httpservletrepsonge 응답)을 authenticationexception {// (this.postonly &&!) 새로운 AuthenticationSerViceException을 던지십시오 ( "인증 메소드가 지원되지 않음 :" + request.getMethod ()); } else {// 사용자, 암호 문자열 username = this.obtainSername (request); 문자열 비밀번호 = this.obtainpassword (요청); if (username == null) {username = ""; } if (password == null) {password = ""; } username = username.trim (); // 토큰 생성, usernamepasswordauthenticationtoken authrequest = 새로운 usernamepasswordauthenticationToken (username, password); this.setDetails (요청, AuthRequest); // return this.getAuthenticationManager (). 인증 (AuthRequest); }}} attemptAuthentication 방법에서 가장 중요한 것은 사용자 이름 및 비밀번호 요청 값을 얻은 다음 추가 확인을 위해 usernamepasswordwordauthenticationtoken 객체를 생성하는 것입니다.
그러나 먼저 usernamepasswordauthenticationtoken의 구성 방법을 볼 수 있습니다.
public usernamepasswordauthenticationToken (Object Principal, Object Credentials) {// 빈 허가 SUPER ((Collection) NULL); this.principal = 교장; this.credentials = 자격 증명; // this.setAuthenticated (false);}를 설정합니다. 실제로 usernamepasswordauthenticationtoken은 Authentication 에서 상속됩니다. 이 개체는 이전 기사에서 언급되었습니다. 사용자 정보, 요청 정보 등과 같은 매개 변수가 포함 된 성공적인 로그인 콜백 메소드의 매개 변수입니다.
그러니 보자
this.getAuthenticationManager (). 인증 (AuthRequest);
여기에는 AuthenticationManager가 있지만 실제 호출은 ProviderManager 입니다.
공개 클래스 제공자 관리자는 AuthenticationManager, MessageSourceaware, 초기화 {공개 인증 인증 (인증 인증)을 authenticationException {class <? 인증 확장> totest = authentication.getClass (); AuthenticationException lastException = null; 인증 결과 = null; 부울 디버그 = logger.isdebugenabled (); 반복자 var6 = this.getProviders (). iterator (); while (var6.hasnext ()) {authenticationProvider Provider = (AuthenticationProvider) var6.next (); // 1. 인증 if (provider.supports (totest)) {// 2. true 논리적 판단 결과 = 제공자 (인증); }}} 공개 인증 인증 (인증 인증) AuthenticationException {userDetails user = this.usercache.getUserFromCache (username); if (user == null) {cachewasused = false; // 1. 사용자 데 테일 user = this.RetRieveUser (username, (usernamepasswordauthenticationToken) 인증); } try {// 2. this.preauthenticationchecks.check (user); // 3. 추가 점검 (비밀번호 확인) this.AdditionAlauthenticationChecks (user, (usernamepasswordauthenticationToken) 인증); } catch (authenticationException var7) {} // 4. 마지막으로 확인하십시오. // 5. 실제 인증 인증을 반환하십시오. 여기서 userDetails의 두 가지 확인은 주로 부울 유형을 반환하는 4 가지 방법을 통해 이루어집니다.
정보를 확인한 후, UsernamePasswordAuthenticationToken 의 구성 방법을 통해 인증 인증이 반환됩니다.
인증 된 인증을 얻은 후에도 SuccessHandler가 다시 호출됩니다. 또는 인증에 실패하면 실패 핸들러를 호출하십시오.
인증 결과가 여러 요청간에 공유되는 방법
사용자 인증 처리 프로세스를 완료 한 후 여러 요청간에 인증 결과를 공유하는 방법에 대해 생각해 봅시다.
이에 대한 구성이 없기 때문에 세션에 인증 결과를 저장 해야하는 기본 메소드를 생각할 수 있습니다.
그렇다면 언제 세션에 저장됩니까?
인증 프로세스의 소스 코드를 계속 볼 수 있습니다. 승인 방법을 통과 한 후 인증이 성공하면 성공적인 승인이 호출됩니다. 이 방법에서는 SuccessHandler뿐만 아니라 더 중요한 코드 라인도 호출됩니다.
SecurityContexTholder.getContext (). setAuthentication (authresult);
SecurityContexTholder는 ThreadLocal을위한 패키지입니다. ThreadLocal은 스레드 내부의 데이터 스토리지 클래스입니다. 이를 통해 데이터는 지정된 스레드에 저장 될 수 있습니다. 데이터 저장 후에는 지정된 스레드에서 저장된 데이터 만 얻을 수 있지만 다른 스레드는 데이터를 얻을 수 없습니다. ThreadLocal의 원칙에 대한 자세한 내용은 이전 기사를 확인하십시오.
일반적으로 동일한 인터페이스의 요청 및 반환은 하나의 스레드에서 완료됩니다. 우리는 SecurityContexTholder에 Authresult를 넣고 다른 곳에서도 가져올 수도 있습니다.
마지막으로, Authresult는 SecurityContextPersistenceFilter 에서 검색되고 세션은 저장됩니다.
SecurityContextPersistenceFilter는 또한 전체 보안 필터 체인의 최전선에있는 필터이기도합니다. 즉, 확인이 시작될 때 필터가 먼저 통과되고 확인이 완료된 후 마지막 패스가 전달됩니다.
인증 된 사용자 정보를 얻습니다
/*** 현재 로그인 한 사용자* @return 완전 인증*/ @getMapping ( "/me1") public object currentUser () {return securityContexTholder.getContext (). getAuthentication ()} @getMapping ( "/me2") public ebject carreser (repintication authentication) userDetails */@getMapping ( "/me3") public Object CuurentUser (@authenticationcipal userDetails userDetails) {return userDetails;}위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.