Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在spring security中添加授权过滤器来验证令牌并设置安全上下文?_Java_Spring_Spring Mvc_Spring Security_Jwt - Fatal编程技术网

Java 如何在spring security中添加授权过滤器来验证令牌并设置安全上下文?

Java 如何在spring security中添加授权过滤器来验证令牌并设置安全上下文?,java,spring,spring-mvc,spring-security,jwt,Java,Spring,Spring Mvc,Spring Security,Jwt,我有一个使用SpringSecurity4的SpringMVC应用程序,我想在请求中添加基于jwt令牌的授权。在过滤器中我需要做的是 从请求头获取令牌 将令牌发送到外部API并获取用户详细信息 在安全上下文中设置获取的详细信息 但是当我启动应用程序时,会出现一个错误,提示需要一个AuthenticationManager。我不确定UserDetails服务如何应用于我的用例。因此,我为测试添加了一个虚拟返回值,因为如果没有UserDetailsService应用程序,它将无法工作。有什么想法吗

我有一个使用SpringSecurity4的SpringMVC应用程序,我想在请求中添加基于jwt令牌的授权。在过滤器中我需要做的是

  • 从请求头获取令牌
  • 将令牌发送到外部API并获取用户详细信息
  • 在安全上下文中设置获取的详细信息
  • 但是当我启动应用程序时,会出现一个错误,提示需要一个AuthenticationManager。我不确定UserDetails服务如何应用于我的用例。因此,我为测试添加了一个虚拟返回值,因为如果没有UserDetailsService应用程序,它将无法工作。有什么想法吗

    Spring安全配置类

    @Configuration
    @EnableWebSecurity
    @EnableGlobalMethodSecurity(
      prePostEnabled = true
    )
    public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
    
    @Autowired
    @Qualifier("applicationUserService")
    UserDetailsService userDetailsService;
    
    @Override
    public void configure(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception {
      SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);
      authenticationManagerBuilder
        .userDetailsService(userDetailsService)
        .passwordEncoder(bCryptPasswordEncoder());
    }
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
      http.csrf().disable().authorizeRequests()
        .antMatchers(HttpMethod.GET, "/home").hasAnyRole("ADMIN")
        .antMatchers(HttpMethod.GET, "/login").hasAnyRole("ADMIN")
        .anyRequest().authenticated()
        .and()
        .addFilter(new AuthorizationFilter(authenticationManager()))
        .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    }
    
    @Bean
    public BCryptPasswordEncoder bCryptPasswordEncoder() {
    return new BCryptPasswordEncoder();
    }
    
    授权筛选器类

    public class AuthorizationFilter extends BasicAuthenticationFilter {
    
    private static final Logger LOGGER = LoggerFactory.getLogger(AuthorizationFilter.class);
    
    public AuthorizationFilter(AuthenticationManager authenticationManager) {
      super(authenticationManager);
    }
    
    @Override
    protected void doFilterInternal(HttpServletRequest req, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
      LOGGER.info("Request Info : {}", req.getRequestURI());
      // get token
      // fetch details from external API
      // set security context
      List<GrantedAuthority> authorities = new ArrayList<>();
      authorities.add((GrantedAuthority) () -> "ROLE_ADMIN");
      SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken("user1", null, authorities));
      LOGGER.info("security context principle:{}", SecurityContextHolder.getContext().getAuthentication().getPrincipal().toString());
      LOGGER.info("authorities context:{}", SecurityContextHolder.getContext().getAuthentication().getAuthorities().toString());
    
      chain.doFilter(req, response);
    }
    
    尝试以下步骤

  • 定义一个
    AbstractAuthenticationProcessingFilter
    来评估请求和返回令牌
  • 
    公共类AwesomeFilter扩展了AbstractAuthenticationProcessingFilter{
    公共授权筛选器(){
    超级(新的AntPathRequestMatcher(“/your_post_url”,“post”));
    }
    @凌驾
    公共身份验证尝试身份验证(HttpServletRequest请求、HttpServletResponse响应){
    //评估请求。。。
    //使用此信息构建自定义身份验证令牌
    AwesomeToken token=新的AwesomeToken();
    //使用身份验证管理器对令牌进行身份验证
    返回getAuthenticationManager().Authentication(令牌);
    }
    
  • 定义一个
    AuthenticationProvider
    来支持您的
    AwesomeToken
    。Spring Security将尝试“支持”这一点
  • public类AwesomeProvider实现AuthenticationProvider{
    @凌驾
    公共身份验证(身份验证)引发AuthenticationException{
    //评估您的自定义令牌
    //调用API等
    //使用权限生成用户身份验证令牌详细信息
    收集尝试以下步骤

  • 定义一个
    AbstractAuthenticationProcessingFilter
    来评估请求和返回令牌
  • 
    公共类AwesomeFilter扩展了AbstractAuthenticationProcessingFilter{
    公共授权筛选器(){
    超级(新的AntPathRequestMatcher(“/your_post_url”,“post”));
    }
    @凌驾
    公共身份验证尝试身份验证(HttpServletRequest请求、HttpServletResponse响应){
    //评估请求。。。
    //使用此信息构建自定义身份验证令牌
    AwesomeToken token=新的AwesomeToken();
    //使用身份验证管理器对令牌进行身份验证
    返回getAuthenticationManager().Authentication(令牌);
    }
    
  • 定义一个
    AuthenticationProvider
    来支持您的
    AwesomeToken
    。Spring Security将尝试“支持”这一点
  • public类AwesomeProvider实现AuthenticationProvider{
    @凌驾
    公共身份验证(身份验证)引发AuthenticationException{
    //评估您的自定义令牌
    //调用API等
    //使用权限生成用户身份验证令牌详细信息
    收集
    
    @Service
    @Qualifier("applicationUserService")
    public class ApplicationUserServiceImpl implements UserDetailsService {
    
      @Override
      public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
        return new User("sidath", "123", emptyList());
      }
    }