2017-08-16 8 views
0

私はSpring Securityを使用するアプリケーションを作成します。私はTokenFilterとWebSecurityConfigを書きました。 私の質問は、SecurityContextにログに記録されたユーザーがどのくらいの期間含まれていますか? 次の質問:私のセキュリティ設定セッションはステートレスかノーですか? SessionのSecurityContext置換えですか?REST - セッションの作成

私のアプリケーションはステートレスな原則を満たしていますか?

public class TokenFilter extends OncePerRequestFilter { 

    @Autowired 
    private UserDetailsService userDetailsService; 

    @Autowired 
    private TokenHelper tokenHelper; 

    private String tokenHeader = "Auth"; 

    @Override 
    protected void doFilterInternal(HttpServletRequest httpServletRequest, 
            HttpServletResponse httpServletResponse, 
            FilterChain filterChain) throws ServletException, IOException { 
     final String authToken = httpServletRequest.getHeader(this.tokenHeader); 

     final String username = tokenHelper.getUsernameFromToken(authToken); 

     if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) { 
      final UserDetails userDetails = this.userDetailsService.loadUserByUsername(username); 

      if (tokenHelper.validateToken(authToken, userDetails)) { 
       UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(
         userDetails, 
         null, 
         userDetails.getAuthorities() 
       ); 
       authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(httpServletRequest)); 
       SecurityContextHolder.getContext().setAuthentication(authentication); 
      } 
     } 

     filterChain.doFilter(httpServletRequest, httpServletResponse); 
    } 
} 

とセキュリティの設定:

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

    @Autowired 
    private UnauthorizedHandler unauthorizedHandler; 

    @Autowired 
    private UserDetailsService userDetailsService; 

    @Autowired 
    public void configureAuthentication(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception { 
     authenticationManagerBuilder 
       .userDetailsService(this.userDetailsService) 
       .passwordEncoder(this.passwordEncoder); 
    } 

    @Autowired 
    public BCryptPasswordEncoder passwordEncoder; 

    @Autowired 
    public TokenFilter tokenFilter; 

    @Override 
    protected void configure(HttpSecurity httpSecurity) throws Exception { 
     httpSecurity 
       .csrf().disable() 
       .exceptionHandling().authenticationEntryPoint(unauthorizedHandler) 
       .and() 
       .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) 
       .and() 
       .authorizeRequests() 
       .antMatchers(HttpMethod.POST, "/login").permitAll() 
       .anyRequest().authenticated(); 

     httpSecurity.addFilterBefore(
       tokenFilter, 
       UsernamePasswordAuthenticationFilter.class 
     ); 

     httpSecurity.headers().cacheControl(); 
    } 
} 

答えて

1

SecurityContextだけAuthenticationインスタンスにアクセスするために使用されます。

SecurityContextは、リクエストの間に保存されます。このロジック(新しい要求を格納してから復元する)はSecurityContextPersistenceFilterに実装され、次にこのストレージロジックをSecurityContextRepositoryに委任します。

SessionCreationPolicy.STATELESSを使用すると、NullSecurityContextRepositoryが使用されます(これはSecurityContextRepositoryの実装です)。実際にはSecurityContextはどこにも格納されず、常に新鮮な(空の)SecurityContextを '復元'します。

SessionCreationPolicy.STATELESSまた、マシンを構成するいずれかのBeanでhttpセッションを作成するためのSpring Securityの禁止。

したがって、SessionCreationPolicy.STATELESSを使用すると、セッションが作成されることはなく、確かにSecurityContextの格納には使用されません。それぞれのリクエストには新鮮なセキュリティコンテキスト(Authenticationは含まれません)があるため、リクエストごとに完全な認証が行われます。

関連する問題