这是我的UserDetailService:
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的一部分。
username
null
password
但是我认为这是不对的,因为Spring Boot的默认登录页面只有一种简单的形式,可以向POST发送请求/login。这是我在做什么。
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"); }
您以JSON(内容类型)的形式发送username和password参数application/json,但必须发送URL编码的参数(内容类型application/x-www- form-urlencoded),请参阅Spring Security Reference:
application/json
application/x-www- form-urlencoded
4 用户名必须作为名为username的HTTP参数存在 5 密码必须作为名为password的HTTP参数存在
4 用户名必须作为名为username的HTTP参数存在
5 密码必须作为名为password的HTTP参数存在