protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { String tokenHeader = request.getHeader(ZwzLoginProperties.HTTP_HEADER); if(ZwzNullUtils.isNull(tokenHeader)){ tokenHeader = request.getParameter(ZwzLoginProperties.HTTP_HEADER); } if (ZwzNullUtils.isNull(tokenHeader)) { chain.doFilter(request, response); return; } try { UsernamePasswordAuthenticationToken token = getUsernamePasswordAuthenticationToken(tokenHeader, response); SecurityContextHolder.getContext().setAuthentication(token); }catch (Exception e){ log.warn("自定义权限过滤失败" + e); } chain.doFilter(request, response); }以上代码作用
时间: 2024-02-14 12:32:28 浏览: 100
以上代码是一个自定义的权限过滤器,在Spring Security的过滤器链中的一部分。其作用如下:
1. 从请求中获取名为 `ZwzLoginProperties.HTTP_HEADER` 的请求头信息(token)。
2. 如果请求头为空,则继续执行过滤器链中的下一个过滤器。
3. 如果请求头不为空,则调用 `getUsernamePasswordAuthenticationToken` 方法,将 token 解析为一个 `UsernamePasswordAuthenticationToken` 对象。
4. 将解析后的身份验证令牌(`UsernamePasswordAuthenticationToken`)设置到安全上下文(`SecurityContextHolder`)中,以便后续的身份验证和授权操作可以使用该令牌。
5. 如果解析或设置身份验证令牌的过程中发生异常,则记录警告日志。
6. 最后,继续执行过滤器链中的下一个过滤器。
该过滤器的主要作用是从请求中提取身份验证的 token,将其转换为 Spring Security 可识别的身份验证令牌,并将该令牌设置到安全上下文中。这样,在后续的处理流程中,Spring Security 将使用该令牌进行用户身份验证和授权操作。
相关问题
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpMethod; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.builders.WebSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Bean public JwtTokenProvider jwtTokenProvider() { return new JwtTokenProvider(); } @Autowired private JwtTokenProvider jwtTokenProvider; @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .addFilterBefore(new JwtTokenFilter(jwtTokenProvider), UsernamePasswordAuthenticationFilter.class) .authorizeRequests() .antMatchers("/api/**").authenticated() .anyRequest().permitAll(); } @Override public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers(HttpMethod.OPTIONS, "/**"); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(12); } }请根据上述代码构建一个JwtTokenFilter类,让上述代码不报错
可以按照以下方式编写JwtTokenFilter类:
```
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class JwtTokenFilter extends OncePerRequestFilter {
private final JwtTokenProvider jwtTokenProvider;
private final UserDetailsService userDetailsService;
public JwtTokenFilter(JwtTokenProvider jwtTokenProvider, UserDetailsService userDetailsService) {
this.jwtTokenProvider = jwtTokenProvider;
this.userDetailsService = userDetailsService;
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
String token = jwtTokenProvider.resolveToken(request);
if (token != null && jwtTokenProvider.validateToken(token)) {
UserDetails userDetails = userDetailsService.loadUserByUsername(jwtTokenProvider.getUsername(token));
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(auth);
}
filterChain.doFilter(request, response);
}
}
```
在此JwtTokenFilter类中,我们注入了JwtTokenProvider和UserDetailsService,其中JwtTokenProvider用于解析和验证JWT令牌,UserDetailsService用于获取用户详细信息。在doFilterInternal方法中,我们首先从请求中获取JWT令牌并验证其是否有效。如果令牌有效,我们使用UserDetailsService加载用户详细信息,并创建一个UsernamePasswordAuthenticationToken对象,将其设置为安全上下文的认证对象。最后,我们调用filterChain.doFilter方法继续处理请求。
JwtAuthorizationFilter.doFilterInternal Failed to convert value of type 'java.lang.String' to required type 'java.lang.Long'
JwtAuthorizationFilter.doFilterInternal是一个过滤器方法,用于处理JWT授权的逻辑。在这个方法中,可能会出现将字符串类型的值转换为Long类型的错误。
这个错误通常发生在尝试将字符串类型的值赋给需要Long类型的参数或变量时。可能是因为在代码中使用了错误的类型转换或者传入的参数类型不匹配导致的。
要解决这个问题,可以检查以下几个方面:
1. 确保传入的参数类型与方法或变量所需的类型匹配。
2. 检查代码中是否存在错误的类型转换操作。
3. 确保传入的参数值是有效的Long类型值,可以尝试使用Long.parseLong()方法将字符串转换为Long类型。
如果以上方法都没有解决问题,可以提供更多的代码细节和错误信息,以便更好地帮助您解决问题。
阅读全文