gpt4 book ai didi

java - 在 Spring Security UsernamePasswordAuthenticationFilter JWT 认证中设置自定义登录 url

转载 作者:搜寻专家 更新时间:2023-10-31 08:08:51 24 4
gpt4 key购买 nike

我正在关注 this auth0's tutorial使用 JWT 保护我的应用程序。

我最终得到了以下 WebSecurity 配置:

@EnableWebSecurity
@AllArgsConstructor(onConstructor = @__(@Autowired))
public class WebSecurity extends WebSecurityConfigurerAdapter {

private final UserDetailsService userDetailsService;
private final BCryptPasswordEncoder passwordEncoder;

@Override
protected void configure(HttpSecurity http) throws Exception {
http.formLogin()
.and().cors()
.and().csrf()
.disable()
.authorizeRequests()
.antMatchers(HttpMethod.POST, REGISTER_URL).permitAll()
.antMatchers(HttpMethod.POST, LOGIN_URL).permitAll()
.anyRequest().authenticated()
.and()
.addFilter(new JWTAuthorizationFilter(authenticationManager()))
.addFilter(new JWTAuthenticationFilter(authenticationManager()))
// This disables session creation on Spring Security
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder);
}

@Bean
public CorsConfigurationSource corsConfigurationSource() {
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", new CorsConfiguration().applyPermitDefaultValues());
return source;
}

}

和以下 JWTAuthenticationFilter:

public class JWTAuthenticationFilter extends UsernamePasswordAuthenticationFilter {

private final AuthenticationManager authenticationManager;

public JWTAuthenticationFilter(AuthenticationManager authenticationManager) {
this.authenticationManager = authenticationManager;
}

@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
try {
ApplicationUser credentials = new ObjectMapper().readValue(request.getInputStream(), ApplicationUser.class);
return authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(
credentials.getUsername(),
credentials.getPassword(),
new ArrayList<>()
)
);
} catch (IOException e) {
throw new RuntimeException(e);
}
}

@Override
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException {
String token = Jwts.builder()
.setSubject(((User) authResult.getPrincipal()).getUsername())
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
.signWith(SignatureAlgorithm.HS512, SECRET.getBytes())
.compact();
response.addHeader(HEADER_STRING, TOKEN_PREFIX + token);
}
}

目前,应用程序接受 /login URL 上的 POST 请求。我想知道如何将 URL 更改为,比方说,/api/auth/login。有没有办法将 URL 字符串注入(inject)身份验证过滤器或以某种方式在安全配置中设置它?

最佳答案

您正在扩展 org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter它本身延伸 org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter .在最后一个类中,有一个名为 setFilterProcessesUrl 的 setter ,它的目的就是这样做:

setFilterProcessesUrl

public void setFilterProcessesUrl(String filterProcessesUrl)

Sets the URL that determines if authentication is required

Parameters: filterProcessesUrl

This是那个 javadoc 部分的链接

所以在您的 WebSecurityConfigurerAdapter 中,您可以这样做:

@Bean
public JWTAuthenticationFilter getJWTAuthenticationFilter() {
final JWTAuthenticationFilter filter = new JWTAuthenticationFilter(authenticationManager());
filter.setFilterProcessesUrl("/api/auth/login");
return filter;
}

然后在同一个类的 configure 方法中引用它而不是创建新实例:

.addFilter(getJWTAuthenticationFilter())

关于java - 在 Spring Security UsernamePasswordAuthenticationFilter JWT 认证中设置自定义登录 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46889350/

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