问题描述
您以JSON(内容类型)的形式发送username
和password
参数application/json
,但必须发送URL编码的参数(内容类型application/x-www-
form-urlencoded
),请参阅Spring Security
Reference:
用户名必须作为名为username的HTTP参数存在
密码必须作为名为password的HTTP参数存在
解决方法
这是我的UserDetailService
:
public class StockUserDetailService implements UserDetailsService {
@Autowired
private UserRepository userRepository;
private static final Logger logger = Logger.getLogger(StockUserDetailService.class);
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
logger.debug("entering loadByUserName");
// MongoDatabase database = mongoClient.getDatabase("springsecurity");
User user = userRepository.findOne(username);
logger.debug("this is teh user ibzect ="+user);
if (user == null) {
logger.info("----------------------------------------------user name is "+username);
throw new UsernameNotFoundException("NAT FOUND");
}
return user;
}
}
但是username
争论总是这样来的null
。我在Stackoverflow上看到大量其他帖子,都遇到了同样的问题。他们中的一些人说这是因为它期望username
和password
作为HTTP标头而不是JSON的一部分。
但是我认为这是不对的,因为Spring Boot的默认登录页面只有一种简单的形式,可以向POST
发送请求/login
。这是我在做什么。
我不明白这里的问题。
PS:我已经正确配置了username
和password
键名:
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.antMatchers("/signup**").permitAll()
.antMatchers("/login/**").permitAll()
.antMatchers("/logout/**").permitAll()
.and()
.authorizeRequests()
.antMatchers("/admin/**").hasAuthority("ADMIN")
.and()
.formLogin()
.usernameParameter("username").
.passwordParameter("password");
}