구현 원리
이전 기사에서는 일반적인 계정 비밀번호로 로그인하는 방법을 소개했습니다 : SpringBoot + Spring Security 기본 사용 및 개인화 로그인 구성. 그러나 현재 휴대 전화의 SMS 확인 코드를 통해 직접 로그인하는 또 다른 일반적인 방법이 있습니다. 여기서 당신은 혼자서 추가 작업을해야합니다.
Springsecurity 인증 프로세스에 대한 자세한 설명에 대해 확실한 이해를 가진 사람은 계정 암호 인증 프로세스에서 다음 범주가 관련되어 있음을 알고 있습니다. usernamepasswordwordauthenticationFilter (매개 변수 획득을 요청하는 데 사용), UsernamePassWordauthenticationToken (사용자 로그인 정보 표현), ProviderManager (인증 검증), ProviderManager
SMS 확인 코드를 통해 로그인하므로 요청 된 매개 변수, 인증 프로세스 및 특정 금액에 대해 사용자 로그인 토큰 정보를 다시 작성해야합니다.
물론 그래픽 검증 코드가 동일하게 구현되면 확인 코드 프로세스를 최우선으로해야합니다. 이 접근법의 장점은 검증 코드 인증 프로세스가 다른 인터페이스를 사용할 수 있도록 분리된다는 것입니다.
기본 구현
확인 코드 확인
SMS 검증 코드의 기능적 구현은 실제로 그래픽 검증 코드의 원리와 동일합니다. 하나는 사진을 프론트 엔드로 반환하는 것이고 다른 하나는 사용자에게 짧은 메시지를 보내는 것입니다. 여기에서 SMS 서비스 제공 업체의 인터페이스를 호출하면됩니다. 더 많은 원칙은 그래픽 검증 코드 기능을 구현하려면 SpringBoot + Springsecurity를 참조하십시오.
AuthenticationToken
계정 비밀번호로 로그인 할 때 usernamepasswordauthenticationToken에는 사용자의 계정, 비밀번호 및 사용 가능한지와 같은 기타 상태 정보가 포함됩니다. 휴대 전화에서 SMS를 통해 로그인하므로 비밀번호가 없습니다. 여기서 우리는 usernamepasswordauthenticationtoken 코드를 복사하고 비밀번호 관련 정보를 제거합니다.
공개 클래스 smscodeauthenticationtoken은 추상적 인 AuthenticationToken {private static final long serialversionuid = springsecuritycoreversion.serial_version_uid; 개인 최종 대상 교장; public smscodeauthenticationToken (String Mobile) {super (null); this.principal = 모바일; setAuthenticated (false); } public smscodeAuthenticationToken (Object Principal, Collection <? 확장 GrangeAuthority> 당국) {Super (당국); this.principal = 교장; super.setAuthenticated (true); // 공개 객체 getCredentials () {return null; } public Object getPrincipal () {return this.principal; } public void setAuthenticated (부울 isauthenticated)는 불법 행위 값을 던진다. {if (iSauthenticated) {새로운 불법 불법 행위 exception ( "이 토큰을 신뢰할 수있는 것으로 설정할 수 없다 - 대신 당연한 목록을 취하는 생성자"); } super.setAuthenticated (false); } @override public void EraseCredentials () {super.erasecredentials (); }} AuthenticationFilter
계정 암호에 로그인하는 과정에서 기본값은 usernamepasswordauthenticationFilter입니다. 기능은 요청에서 계정 및 비밀번호를 얻고 요청 방법을 확인하고 AuthenticationToken을 생성하는 것입니다. 여기서 우리의 매개 변수는 특정 방식으로 변경되었으므로 여전히 기존 메소드이며 간단한 수정을 위해 복사합니다.
공개 클래스 smscodeauthenticationfilter 확장 추상화 프로세스 필터 {// 요청 매개 변수 주요 개인 문자열 mobiparameter = securityconstants.default_parameter_name_mobile; // 그것은 단지 지원되는 게시물 개인 부울 postonly = true; public smscodeauthenticationfilter () {// 인터페이스의 URL Super (new AntpathRequestMatcher (SecurityConstants.Default_Login_Processing_URL_Mobile, "Post")를 요청합니다. } 공개 인증 시도 시도 (httpservletrequest 요청, httpservletResponse 응답)는 authenticationException {if (postonly &&! request.getMethod (). Equals ( "post")) {throw new authenticationserviceException ( "인증 방법 :" + requestod ()); } // 요청 매개 변수 이름 문자열에 따라 요청 값을 얻습니다. mobile = acemobile (요청); if (mobile == null) {mobile = ""; } mobile = mobile.trim (); // 해당 AuthenticationToken SMSCodeAuthenticationToken AuthRequest = New SMSCodeAuthenticationToken (Mobile)을 생성합니다. setDetails (요청, AuthRequest); reture this.getAuthenticationManager (). 인증 (AuthRequest); } / *** 휴대폰 번호* / 보호 된 문자열 acemobile (httpservletrequest request) {return request.getParameter (mobileparameter); } // 관련없는 코드를 생략} 공급자
계정 비밀번호의 로그인 프로세스 중에 비밀번호의 정확성과 계정을 사용할 수 있는지 여부는 daoauthenticationProvider를 통해 확인됩니다. 우리는 또한 제공자를 직접 구현해야합니다
공개 클래스 smscodeauthenticationprovider는 AuthenticationProvider를 구현합니다. / ** * Identity Logic Verification * @param 인증 * @return * @Throws AuthenticationException */ @override public Authentication Authentication (Authentication Authentication Authentication)은 AuthenticationException {smscodeAuthenticationTokenTokentoken = (SMSCODEATETICATICTOKEN) 인증; userDetails user = userDetailsService.loadUserByUserName ((String) AuthenticationToken.getPrincipal ()); if (user == null) {새로운 내부 AuthenticationServiceException ( "사용자 정보를 얻을 수 없음"); } smscodeauthenticationToken authenticationResult = 새로운 smscodeauthenticationToken (user, user.getAuthorities ()); AuthenticaticResult.setDetails (AuthenticaticToken.getDetails ()); AuthenticationResult 리턴; } @override public boolean supports (class <?> 인증) {return smscodeauthenticationtoken.class.isassignablefrom (인증); } public userDetailsService getUserDetailsService () {return userDetailSService; } public void setUserDetailsService (userDetAilsService userDetailSService) {this.userDetailsService = userDetailSService; }} 구성
주요 인증 프로세스는 위의 네 가지 프로세스를 통해 달성됩니다. 여기서는 구성을 줄일 수 있습니다.
@ComponentPublic Class SMSCODEATENTICATIONCITIONCONFIG 확장 SECIRPORCONFIGURERADAPTER <defaultsecurityFilterChain, httpsecurity> {@autowired private authenticationsUccessHandler myauthenticationSuccessHandler; @autowired Private AuthenticationFailureHandler MyAuthenticationFailureHandler; @autowired private userDetailsService userDetailsService; @override public void configure (httpsecurity http) 예외 {smscodeauthenticationfilter smscodeauthenticationfilter = new smscodeauthenticationFilter (); smscodeauthenticationfilter.setauthenticationManager (http.getsharedObject (authenticationManager.class)); smscodeauthenticationFilter.SetAuthenticationSuccessHandler (myAuthenticationSuccessHandler); smscodeauthenticationFilter.SetAuthenticationFailureHandler (myAuthenticationFailureHandler); smscodeauthenticationprovider smscodeauthenticationprovider = new smscodeauthenticationprovider (); smscodeauthenticationprovider.setuserDetailsService (userDetailsService); http.authenticationprovider (smscodeauthenticationprovider) .addfilterafter (smscodeauthenticationfilter, usernamepasswordauthenticationfilter.class); }} // browersecurityconfig.java@overrideprotected void configure (httpsecurity http)는 예외 {http.apply (smscodeauthenticationsecurityconfig);} 코드 다운로드
스프링 보안
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.