2017-06-01 328 views
1

在Web應用程序中。是如此普遍,存儲在會話的用戶的詳細信息,但是,如果在春季啓動配置你SecurityConfig類,如下所示:Spring Boot應用程序。 SecurityContextHolder與HttpSession

@Configuration 
@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter {     

    @Autowired 
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
     auth 
      .userDetailsService(userSecurityService) 
      .passwordEncoder(passwordEncoder()); 
    } 
... 
} 

@Service 
public class UserSecurityService implements UserDetailsService { 

    /** The application logger */ 
    private static final Logger LOG = LoggerFactory.getLogger(UserSecurityService.class); 

    @Autowired 
    private UserRepository userRepository; 

    @Override 
    public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException { 

     LOG.info("Searching user with email: " + email); 

     User user = userRepository.findByEmail(email); 

     if (null == user) { 
      LOG.warn("Username {} not found", email); 
      throw new UsernameNotFoundException("Username " + email + " not found"); 
     } 
     return user; 
    } 
} 

public class User implements Serializable, UserDetails { 
.. 
} 

那麼你可以記錄所有來自登錄用戶的信息,始終使用

User user = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal() 

所以..在HttpSession中存儲用戶信息是一個不好的做法,舊的做法或我錯過了什麼?

回答

1

Spring Security是一個安全框架,可用於Web和獨立應用程序。 SecurityContextHolder提供了獲得SecurityContext和最終User的統一方式。

當在Web應用程序中SecurityContext的存儲委託給SecurityContextRepository和使用的默認實現是HttpSessionSecurityContextRepository所以它仍然將其存儲在HttpSession結束,但你也可以創建自己的實現使用Spring安全性和將其存儲在其他位置(數據庫,Redis等)。

簡而言之,SecurityContextHolder是一個統一的方式來獲得Spring Security使用的SecurityContext,而無需您在所有地方知道它的存儲方式/位置。

相關問題