gpt4 book ai didi

java - 带 JSON 的 Spring Security 不起作用

转载 作者:行者123 更新时间:2023-12-01 09:45:34 25 4
gpt4 key购买 nike

我是 Spring 新手,我正在尝试弄清楚如何对用户进行身份验证。

目前,一切似乎都设置正确。当我使用x-www-form-urlencoded时,我可以成功登录。当使用application/json时,我的应用程序没有收到emailAddress > 参数。

我一直在谷歌上搜索并检查,但找不到任何相关内容。

这是我的SecurityConfig

package com.myapp.config;

import com.myapp.security.RestAuthenticationEntryPoint;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler;
import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler;
import org.springframework.web.bind.annotation.RestController;

@EnableWebSecurity
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
@Qualifier("customUserDetailsService")
private UserDetailsService userDetailsService;

@Autowired
private RestAuthenticationEntryPoint restAuthenticationEntryPoint;

@Autowired
public void configure(AuthenticationManagerBuilder builder) throws Exception {
builder.userDetailsService(userDetailsService);
builder.authenticationProvider(this.authenticationProvider());
}

@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}

public DaoAuthenticationProvider authenticationProvider() {
DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
authenticationProvider.setUserDetailsService(userDetailsService);
authenticationProvider.setPasswordEncoder(passwordEncoder());

return authenticationProvider;
}

@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);

http.csrf().disable()
.exceptionHandling()
.authenticationEntryPoint(restAuthenticationEntryPoint)
.and()
.authorizeRequests()
.antMatchers("/").authenticated()
.and()
.formLogin().loginPage("/login").usernameParameter("emailAddress").passwordParameter("password")
.successHandler(new SimpleUrlAuthenticationSuccessHandler())
.failureHandler(new SimpleUrlAuthenticationFailureHandler())
.and()
.logout();
}
}

最佳答案

formLogin().loginPage("/login").usernameParameter("emailAddress").passwordParameter("password")
.successHandler(new SimpleUrlAuthenticationSuccessHandler())
.failureHandler(new SimpleUrlAuthenticationFailureHandler())

在上面的配置中,一个标准的UsernamePasswordAuthenticationFilter用于从请求参数中获取用户名和密码。但是,标准过滤器不会解析请求中 json 字符串中的参数。

您可以尝试创建自定义 UsernamePasswordAuthenticationFilter从 json 字符串获取用户名和密码,并在配置中应用自定义过滤器。但是,与 XML 配置不同的是,可以使用 <custom-filter position="FORM_LOGIN_FILTER" ref="yourCustomFilter" /> ,您无法通过 Java Config 将表单登录过滤器替换为您的自定义过滤器。

作为解决方法,您可以尝试以下操作:

  1. 创建自定义过滤器扩展 AbstractAuthenticationProcessingFilter从json字符串中获取用户名和密码并将解析后的参数放入请求中。解决方案是使用 HttpRequestWrapper类,它允许您用另一个请求包装一个请求。您可以对其进行子类化,并覆盖 getParameter返回从 json 字符串解析的用户名和密码。然后,您可以将打包的请求传递给 chain.doFilter .
  2. 在标准 UsernamePasswordAuthenticationFilter 之前添加自定义过滤器与 HttpSecurity#addFilterBefore(yourCustomFilter, UsernamePasswordAuthenticationFilter.class)

由于用户名和密码是从json字符串解析到请求参数中的,所以标准UsernamePasswordAuthenticationFilter应该能够执行身份验证。

关于java - 带 JSON 的 Spring Security 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38078839/

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