gpt4 book ai didi

java - 在 Spring Security 过滤器链中添加嵌套的自定义过滤器

转载 作者:行者123 更新时间:2023-12-02 01:27:19 27 4
gpt4 key购买 nike

我创建了两个过滤器来使用 JWT token 执行身份验证。我想在第一个异常:exceptionTokenVerificationHandlerFilter 中处理 JWT 异常,并检查第二个异常:jwtTokenFilter 中是否一切正常。如果身份验证由于过期日期而失败,则流程返回到第一个过滤器,并向前端发送一条响应,其中包含拒绝访问消息。

我用这个答案作为我的应用程序的支持: https://github.com/szerhusenBC/jwt-spring-security-demo/issues/63#issuecomment-377012514

我的类(class):

WebSecurityConfig

    @Override
protected void configure(HttpSecurity http) throws Exception {
http
.httpBasic().disable()
.addFilterBefore(exceptionTokenVerificationHandlerFilter, JwtTokenFilter.class)
.addFilterBefore(jwtTokenFilter, UsernamePasswordAuthenticationFilter.class)
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.cors().and()
.csrf().disable()
.authorizeRequests() // .antMatchers("/**")
.antMatchers("/login/**", "/register/**").permitAll()
.antMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
//.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
.addFilterAt(customUsernamePasswordAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)
/*.formLogin()
.loginPage("http://localhost:4200/login")//.failureUrl("/login-error")
.loginProcessingUrl("/login")
.usernameParameter("email")
.successHandler(customAuthenticationSuccessHandler)
.and()*/
.logout()
.permitAll();
}

ExceptionTokenVerificationHandlerFilter

package app.shellx.security;

import java.io.IOException;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatus;
import org.springframework.web.filter.OncePerRequestFilter;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import io.jsonwebtoken.JwtException;

@Configuration
public class ExceptionTokenVerificationHandlerFilter extends OncePerRequestFilter {

@Override
public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
try {
filterChain.doFilter(request, response);
} catch (JwtException e) {

String message;

switch(e.getClass().getName()) {
case "ExpiredJwtException":
message = "token-expired";
break;
default:
message = e.getMessage();
break;
}

response.setStatus(HttpStatus.BAD_REQUEST.value());
response.getWriter().write(convertObjectToJson(message));
}
}

private String convertObjectToJson(Object object) throws JsonProcessingException {
if (object == null) {
return null;
}
ObjectMapper mapper = new ObjectMapper();
return mapper.writeValueAsString(object);
}

}

JwtTokenFilter

package app.shellx.security;

import java.io.IOException;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.filter.GenericFilterBean;

@Configuration
public class JwtTokenFilter extends GenericFilterBean {

private JwtTokenProvider jwtTokenProvider;

public JwtTokenFilter(JwtTokenProvider jwtTokenProvider) {
this.jwtTokenProvider = jwtTokenProvider;
}

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) throws IOException, ServletException {
String token = jwtTokenProvider.resolveToken((HttpServletRequest) req);
if (token != null && jwtTokenProvider.validateToken(token)) {
Authentication auth = token != null ? jwtTokenProvider.getAuthentication(token) : null;
SecurityContextHolder.getContext().setAuthentication(auth);
}
filterChain.doFilter(req, res);
}
}

那么我可以在过滤器链中添加两个自定义过滤器吗?

我目前从编译器收到以下错误消息:

Caused by: java.lang.IllegalArgumentException: Cannot register after unregistered Filter class app.shellx.security.JwtTokenFilter

最佳答案

我通过在两个过滤器类上使用 @Order 注释解决了自己的问题。@Order(1) 用于ExceptionTokenVerificationHandlerFilter@Order(2) 用于JwtTokenFilter

我还通过 UsernamePasswordAuthenticationFilter.class 更改了第一个 addFilterBefore() 的第二个参数看来我们不能将自定义过滤器作为该方法的第二个参数。

关于java - 在 Spring Security 过滤器链中添加嵌套的自定义过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57576422/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com