Spring Security rest 서비스 구축 rememberme 내 기능 기억

Spring security 나의 기본 원 리 를 기억 하 라:
로그 인 할 때 필터 UsernamePassword AuthenticationFilter 에 전송 을 요청 합 니 다.이 필터 인증 이 성공 하면 Remember MeService 를 호출 하여 token 을 생 성하 여 브 라 우 저 쿠키 에 token 을 기록 합 니 다.또한 Remember MeService 에는 Token Repository 가 있 습 니 다.token 과 사용자 정 보 를 데이터베이스 에 기록 합 니 다.이렇게 하면 사용자 가 시스템 에 다시 접근 하여 특정한 인 터 페 이 스 를 방문 할 때 Remember MeAuthenticationFilter 의 필 터 를 거 칩 니 다.그 는 쿠키 에 있 는 token 을 읽 고 Remember Service 에 건 네 줍 니 다.Remember Service 는 Token Repository 로 token 에 따라 데이터베이스 에서 기록 이 있 는 지 확인 하고 기록 이 있 으 면 사용자 이름 을 찾 습 니 다.UserDetailService 를 호출 하여 사용자 이름 에 따라 사용자 정 보 를 얻 은 다음 Security Context 에 넣 습 니 다.
 RememberMeAuthenticationFilterSpring Security 에서 필터 체인 의 마지막 두 번 째 필터 위 치 를 인증 하고 다른 인증 필터 가 인증 에 성공 하지 못 할 때 Remember MeAuthentication Filter 를 호출 하여 인증 을 시도 합 니 다.

실현:
 1.로그 인 폼 에<input type="checkbox" name="remember-me" value="true"/>,SpringSecurity 는SpringSessionRememberMeServices클래스 에서 상수 하 나 를 정 의 했 습 니 다.기본 값 은 remember-me 입 니 다.
 2.위의 원리 도 를 통 해 알 수 있 듯 이 TokenRepository 를 설정 하고 생 성 된 token 을 데이터베이스 에 저장 합 니 다.이것 은 bean 을 설정 하 는 설정 입 니 다.Browser Security Config 에 넣 었 습 니 다.
3,configure 에서 설정
4,BrowserProperties 에 자동 로그 인 시간 을 더 해서 내 시간 을 기억 해서 설정 할 수 있 는

//       
private int rememberMeSeconds = 10;  
package com.imooc.s@Configuration //      
public class BrowserSecurityConfig extends WebSecurityConfigurerAdapter{
  //            
  @Autowired
  private SecurityProperties securityProperties;
  //             
  @Autowired
  private AuthenticationSuccessHandler imoocAuthenticationSuccessHandler;
  //             
  @Autowired
  private AuthenticationFailureHandler imoocAuthenticationFailureHandler;
  //   
  @Autowired
  private DataSource dataSource;
  @Autowired
  private UserDetailsService userDetailsService;
  //   org.springframework.security.crypto.password.PasswordEncoder
  @Bean
  public PasswordEncoder passwordencoder(){
    //BCryptPasswordEncoder implements PasswordEncoder
    return new BCryptPasswordEncoder();
  }
  /**
   *    TokenRepository  ,        
   *           token 
   * @Description:    TokenRepository  
   * @param @return  JdbcTokenRepositoryImpl
   * @return PersistentTokenRepository 
   * @throws
   * @author lihaoyang
   * @date 2018 3 5 
   */
  @Bean
  public PersistentTokenRepository persistentTokenRepository(){
    JdbcTokenRepositoryImpl jdbcTokenRepository = new JdbcTokenRepositoryImpl();
    jdbcTokenRepository.setDataSource(dataSource);
    //          ,   JdbcTokenRepositoryImpl     CREATE_TABLE_SQL     
    jdbcTokenRepository.setCreateTableOnStartup(true);
    return jdbcTokenRepository;
  }
  //   :       
  @Override
  protected void configure(HttpSecurity http) throws Exception {
    //      
    ValidateCodeFilter validateCodeFilter = new ValidateCodeFilter();
    //                
    validateCodeFilter.setAuthenticationFailureHandler(imoocAuthenticationFailureHandler);
    //        url
    validateCodeFilter.setSecurityProperties(securityProperties);
    validateCodeFilter.afterPropertiesSet();
    //               ,  =  +  
    //http.httpBasic() //           
    //
    http //                
      .addFilterBefore(validateCodeFilter, UsernamePasswordAuthenticationFilter.class)
      //        
      .formLogin() 
        .loginPage("/authentication/require") //      BrowserSecurityController
        //     UsernamePasswordAuthenticationFilter     url "/login",    
        .loginProcessingUrl("/authentication/form") 
        .successHandler(imoocAuthenticationSuccessHandler)//          
        .failureHandler(imoocAuthenticationFailureHandler) //        
      .and()
      //         
      .rememberMe()
        .tokenRepository(persistentTokenRepository())//TokenRepository,          token 
        .tokenValiditySeconds(securityProperties.getBrowser().getRememberMeSeconds())//     
        .userDetailsService(userDetailsService) //      ,  userDetailsService      
      .and()
      //        
      .authorizeRequests() 
        // /authentication/require:    ,securityProperties.getBrowser().getLoginPage():        
        .antMatchers("/authentication/require",
        securityProperties.getBrowser().getLoginPage(),//        ,    
        "/verifycode/image").permitAll() //   
        .anyRequest()    //    
        .authenticated()  //       
      .and()
        .csrf().disable() //  csrf  
      ;  
  }
}ecurity.browser;
그 중에서 데이터베이스 와 접촉 하려 면 데이터 원본 을 주입 해 야 합 니 다:application.properties

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/imooc-demo
spring.datasource.username=root
spring.datasource.password=root
응용 프로그램 을 시작 합 니 다.localhost:8080/user 에 접근 하려 면 로그 인 이 필요 합 니 다.


로그 인 성공:

데이터베이스:persistent 생 성logins 표,데이터 저장

서 비 스 를 중단 합 니 다.새 시작(토 큰 표를 저장 하 는jdbcTokenRepository.setCreateTableOnStartup(true);을 설명 합 니 다.사용자 로그 인 정보 가 모두 session 에 존재 하기 때문에 서 비 스 를 다시 시작 한 후에 localhost:8080/user 를 방문 합 니 다.로그 인 페이지 로 다시 유도 해 야 하 는데 저 를 기억 하 는 것 이 설정 되 어 있 기 때문에 직접 방문 할 수 있 고 인터페이스 데 이 터 를 얻 었 습 니 다.

요청 헤더:

이 쯤 되면 기본 적 인 remember Me 가 완성 되 었 습 니 다.
전체 코드 를 github 에 두 었 습 니 다:https://github.com/lhy1234/spring-security
총결산
위 에서 말씀 드 린 것 은 편집장 님 께 서 소개 해 주신 Spring Security 구축 rest 서비스 입 니 다.rememberme 은 제 기능 을 기억 하고 여러분 께 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기