这是我的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");
}
答案 0 :(得分:4)
您发送username
和password
参数作为JSON(内容类型application/json
),但您必须发送URL编码参数(内容类型application/x-www-form-urlencoded
),请参阅{ {3}}:
4 用户名必须作为名为username
的HTTP参数出现5 密码必须作为名为password
的HTTP参数出现
答案 1 :(得分:0)
在您的数据库中username
是id
实体的User
?
如果没有,那么你只有一个名为username的字段,那么你必须在你的UserRepository中写一个魔术方法
User findByUsername(String username);
并在StockUserDetailService
中使用它从数据库中检索用户。 findOne()
方法需要id
作为参数,在您的情况下,它与id
没有任何关系。