首页 文章

Spring安全自定义UserDetails未进行身份验证

提问于
浏览
0

同时试验 spring 启动,安全性和数据 .

我刚刚遇到这种情况:

我在内存数据库中使用H2并使用用户名和密码在启动时使用liquibase对一个用户进行poblate .

现在我希望spring security能够对H2进行身份验证 . 为此我有这个代码:

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

并实现userDetails如下:

@Override
public UserDetails loadUserByUsername(String username) {
//this works, the user with pass is pulled
    com.fix.demo.logic.user.User byUsername = 
userRepository.findByUsername(username); 
    if (byUsername == null) {
        System.out.println("No user found with username: ");
        return null; //trow ex here
    }
    User user = new User(byUsername.getUsername(),
            byUsername.getPassword(), true, true,
            true, true, getAuthorities(Collections.singletonList("user")));
    //System.out.println(user.toString());
    //System.out.println(byUsername.toString()+ "   "+byUsername.getPassword());
        return user;
    }

但是我的测试一直没能用

身份验证不应为null

并尝试登录将给我

凭证不好

我的自定义UserDetailsService实现的必要条件是什么?

这是失败的测试:

@Test
public void loginWithValidUserThenAuthenticated() throws Exception {
    FormLoginRequestBuilder login = formLogin()
            .user("admin")
            .password("root");

    mockMvc.perform(login)
            .andExpect(authenticated().withUsername("admin"));
}

1 回答

  • 0

    其中一个原因是,密码可能是我编码的,你需要告诉spring安全性使用编码器 . 将以下行添加到配置覆盖 .

    auth.setPasswordEncoder(passwordEncoder());
    

    定义passwordEncoder bean .

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

相关问题