Spring Security 的核心组件SecurityContextHolder 您所在的位置:网站首页 bcryptpasswordencoder登录不了 Spring Security 的核心组件SecurityContextHolder

Spring Security 的核心组件SecurityContextHolder

2023-07-01 14:00| 来源: 网络整理| 查看: 265

Spring Security是一个强大的安全框架,其核心组件之一是SecurityContextHolder。SecurityContextHolder用于管理当前用户的安全上下文信息,包括认证信息、授权信息等。

SecurityContextHolder的原理

在Spring Security中,安全上下文信息保存在SecurityContextHolder中。每个线程都有自己的SecurityContextHolder,可以通过ThreadLocal对象实现。当用户进行身份认证或访问授权时,SecurityContextHolder会将相应的安全信息保存在当前线程的SecurityContextHolder中。这样,我们就可以通过SecurityContextHolder来获取当前用户的安全信息,而不必显式地传递这些信息。

SecurityContextHolder的用法

在Spring Security中,我们可以通过SecurityContextHolder来获取当前用户的认证信息和授权信息。SecurityContextHolder提供了以下两个静态方法来获取SecurityContext对象:

public static SecurityContext getContext(): 返回当前线程的SecurityContext对象;public static void setContext(SecurityContext context): 设置当前线程的SecurityContext对象。

SecurityContext是一个接口,它定义了获取认证信息和授权信息的方法。在Spring Security中,我们通常使用实现了SecurityContext接口的SecurityContextImpl类。

SecurityContextHolder的示例

下面我们来看一个示例,演示如何在Spring Boot应用程序中使用SecurityContextHolder。

首先,在我们的应用程序中,我们需要定义一个实现了UserDetailsService接口的类,用于加载用户信息。示例代码如下:

@Service public class CustomUserDetailsService implements UserDetailsService { @Autowired private UserRepository userRepository; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { User user = userRepository.findByUsername(username); if (user == null) { throw new UsernameNotFoundException("User not found with username: " + username); } return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), user.getRoles().stream().map(role -> new SimpleGrantedAuthority(role.getName().name())).collect(Collectors.toList())); } }

在上述示例中,我们定义了一个实现了UserDetailsService接口的CustomUserDetailsService类,用于加载用户信息。在loadUserByUsername()方法中,我们通过调用UserRepository对象的findByUsername()方法,从数据库中获取指定用户名的用户信息。如果用户不存在,则抛出UsernameNotFoundException异常。

接下来,我们需要在Spring Security配置类中使用CustomUserDetailsService。示例代码如下:

@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private CustomUserDetailsService userDetailsService; @Autowired private JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint; @Bean public JwtAuthenticationFilter jwtAuthenticationFilter() { return new JwtAuthenticationFilter(); } @Override public void configure(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception { authenticationManagerBuilder.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder()); } @Bean(BeanIds.AUTHENTICATION_MANAGER) @Override public AuthenticationManager authenticationManagerBean() throws Exception { return super.authenticationManagerBean(); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .authorizeRequests() .antMatchers("/api/auth/**").permitAll() .anyRequest().authenticated() .and() .exceptionHandling().authenticationEntryPoint(jwtAuthenticationEntryPoint) .and() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class); } }

在上述示例中,我们定义了一个SecurityConfig类,并在该类中使用了CustomUserDetailsService类。在configure()方法中,我们调用了AuthenticationManagerBuilder对象的userDetailsService()方法,将CustomUserDetailsService对象作为参数传递给该方法,以加载用户信息。在configure()方法中,我们还设置了PasswordEncoder对象,用于加密和解密密码。在configure(HttpSecurity http)方法中,我们定义了应用程序的安全策略,指定了哪些URL需要身份认证。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有