2017-06-01 332 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,而无需您在所有地方知道它的存储方式/位置。

相关问题