Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring security UserDetails服务不工作_Java_Spring_Spring Security_Spring Boot - Fatal编程技术网

Java Spring security UserDetails服务不工作

Java Spring security UserDetails服务不工作,java,spring,spring-security,spring-boot,Java,Spring,Spring Security,Spring Boot,好的,伙计们,我希望你们能帮助我,这是我最后一次尝试。我对这个春天的安全世界很陌生,我不能让它工作。我尝试了很多东西,学习了很多教程,什么也没做 问题是,正如您在标题中看到的,让自定义用户详细信息服务正常工作。它只是没有登录,似乎没有调用customuserdetailsservice,因为系统输出没有显示在控制台中 它具有spring安全内存功能,是一种魅力。下面是我的代码 Spring安全配置: @Configuration @EnableWebSecurity @ComponentScan

好的,伙计们,我希望你们能帮助我,这是我最后一次尝试。我对这个春天的安全世界很陌生,我不能让它工作。我尝试了很多东西,学习了很多教程,什么也没做

问题是,正如您在标题中看到的,让自定义用户详细信息服务正常工作。它只是没有登录,似乎没有调用customuserdetailsservice,因为系统输出没有显示在控制台中

它具有spring安全内存功能,是一种魅力。下面是我的代码

Spring安全配置:

@Configuration
@EnableWebSecurity
@ComponentScan(basePackageClasses = CustomUserDetailsService.class)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
UserDetailsService userDetailsService;

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    //auth.inMemoryAuthentication().withUser("ram").password("ram123").roles("ADMIN");
    auth.userDetailsService(userDetailsService).passwordEncoder(passwordencoder());
}

@Override
public void configure(WebSecurity web) throws Exception {
  web
    .ignoring()
       .antMatchers("/bower_components/**", "/resources/**", "/img/**"); // #3
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.httpBasic().and().csrf().disable()
    .authorizeRequests()
      .antMatchers("/", "/home", "/call").permitAll() // #4
      .antMatchers("/resource", "/video").hasRole("USER") // #6
      .anyRequest().authenticated();
}

@Bean(name="passwordEncoder")
public PasswordEncoder passwordencoder(){
    return new BCryptPasswordEncoder();
}

}
CustomUserDetailsService

@Service("customUserDetailsService")
public class CustomUserDetailsService implements UserDetailsService{

private UserService userService;

@Override
public UserDetails loadUserByUsername(String ssoId)
        throws UsernameNotFoundException {
    User user = userService.findByUsername(ssoId);
    System.out.println("User : "+user);
    if(user==null){
        System.out.println("User not found");
        throw new UsernameNotFoundException("Username not found");
    }
        return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), 
             user.isEnabled(), true, true, true, getGrantedAuthorities(user));
}


private List<GrantedAuthority> getGrantedAuthorities(User user){
    List<GrantedAuthority> authorities = new ArrayList<>();

    authorities.add(new SimpleGrantedAuthority(user.getRole()));

    System.out.print("authorities :"+authorities);
    return authorities;
}
}
我还测试了与数据库的通信,效果非常好。我正在寻求任何帮助。对不起,英语不好。谢谢大家!


编辑:在下面回答了我自己的问题。

SecurityConfig
class中:

@Autowired
CustomUserDetailsService customUserDetailsService;

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(customUserDetailsService);
}
改变

另外,在web/socket配置中导入安全配置,并将组件扫描移到那里,而不是移到安全配置上

@ComponentScan(basePackageClasses = CustomUserDetailsService.class)
@Import(value = { SecurityConfig.class })
public class WebConfig extends WebMvcConfigurerAdapter { /*...*/ }

最后,我留下了内置的记忆符号,只是为了我必须做的演示。我认为我的问题与spring boot中的某些内容以及应用程序中的初始化有关。

您正在安全配置中设置hasRole(“”),并使用权限进行身份验证

而不是使用.antMatchers(“/resource”,“/video”).hasRole(“用户”)
使用.antMatchers(“/resource“,“/video”).hasAuthority(“用户”)

什么不起作用?这不是注射吗?你没有权限吗?更详细地描述什么不起作用。转储代码并告诉它不起作用是没有帮助的(这也是结束问题的原因)。哦,对不起,我完全忘记了。它只是没有登录,似乎根本没有调用userDetailsService…并且它将401抛出到angular…请添加异常或更多详细信息。有了这些信息,我们就不清楚了。请添加您的日志和错误(如果有)。它能在数据库中找到用户吗?这就是问题所在,没有错误,身份验证根本不起作用。它与内存中的功能配合得很好。似乎没有调用CustomUserDetails服务,因为系统输出没有显示在控制台中…我不知道这是否是一个问题,但我没有任何网络配置。我试图创建一个,但仍然得到相同的结果..检查启动时是否有任何错误。确保服务正在接受。我用MVC测试了它,它成功了。
@Autowired
UserDetailsService userDetailsService;
@Autowired
CustomUserDetailsService userDetailsService;
@ComponentScan(basePackageClasses = CustomUserDetailsService.class)
@Import(value = { SecurityConfig.class })
public class WebConfig extends WebMvcConfigurerAdapter { /*...*/ }