这是我运行时的错误详细信息。


  申请启动失败
  
  
  
  描述:
  
  com.word.security.WebSecurityConfig中的字段userDetailsS​​ervice
  需要一个类型的bean
  'org.springframework.security.core.userdetails.UserDetailsS​​ervice'
  找不到。
  
  行动:
  
  考虑定义一个类型的bean
  'org.springframework.security.core.userdetails.UserDetailsS​​ervice'
  您的配置。


这是WebSecurityConfig.java

 @Configuration
    @EnableWebSecurity
    @Service
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;

@Override
protected void configure(HttpSecurity http) throws Exception {
    // disable caching
    http.headers().cacheControl();

    http.csrf().disable() // disable csrf for our requests.
            .authorizeRequests()
            .antMatchers("/").permitAll()
            .antMatchers(HttpMethod.GET, "/login").permitAll()
            .antMatchers(HttpMethod.POST, "/createuser").permitAll()
            .antMatchers(HttpMethod.GET, "/user/1").permitAll()
            .anyRequest().authenticated()
            .and()
            // We filter the api/login requests
            .addFilterBefore(new JWTLoginFilter("/login", authenticationManager()), UsernamePasswordAuthenticationFilter.class)
            // And filter other requests to check the presence of JWT in header
            .addFilterBefore(new JWTAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
}

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    // Create a default account
    auth.userDetailsService(userDetailsService());
}
 @Bean
    public UserDetailsService userDetailsService() {
        return super.userDetailsService();
    }


}

Intellj IDEA在下面显示了Could not AutowireuserDetailsService错误;

@Autowired
private UserDetailsService userDetailsService;


但是,在另一个名为SecurityService的类上;

@Service
public class SecurityService {
    @Autowired
    IUserService userService;

    @Autowired
    private AuthenticationManager authenticationManager;

    @Autowired
    private UserDetailsService userDetailsService;

    public User activeUser() {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        String username = auth.getName();
        Optional<User> user = userService.getUserByName(username);

        if (user.isPresent()) {
            return user.get();
        }
        return null;
    }
    public void autologin(String username, String password) {
        UserDetails userDetails = userDetailsService.loadUserByUsername(username);
        UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(userDetails, password, AuthorityUtils.createAuthorityList("USER"));

        authenticationManager.authenticate(usernamePasswordAuthenticationToken);

        if (usernamePasswordAuthenticationToken.isAuthenticated()) {
            SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken);
        }
    }
}


更新

UserController.Class

@RestController
public class UserController {
@Autowired
private IUserService userService;

@Autowired
private SecurityService securityService;

   @RequestMapping(value = "/createuser", method = RequestMethod.POST)
    public String createUser(@RequestBody User user, Model md) {
        if (userService.checkExistUserName(user.getUserName())) {
            md.addAttribute("LoginError", true);
            return "bu kullanici adi ile bir kullanici bulunmaktadir. Lutfen baska bir kullanici adi ile deneyiniz";
        }
        User newUser = new User();
        newUser.setUserName(user.getUserName());
        newUser.setFirstname(user.getFirstname());
        newUser.setUserMail(user.getUserMail());
        newUser.setSurname(user.getSurname());
        newUser.setUserPassword(user.getUserPassword());
        userService.saveUser(user);

        /* Automatic login after register */
        securityService.autologin(user.getUserName(), user.getUserPassword());

        return user.getId().toString();
    }


我没有得到与WebSecurityConfig.java相同的错误。

但是现在尝试创建用户后出现如下所示的StackoverFlow错误;


  java.lang.StackOverflowError:在null
  org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter $ UserDetailsS​​erviceDelegator.loadUserByUsername(WebSecurityConfigurerAdapter.java:441)
  〜[spring-security-config-4.2.1.RELEASE.jar:4.2.1.RELEASE]在
  org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter $ UserDetailsS​​erviceDelegator.loadUserByUsername(WebSecurityConfigurerAdapter.java:442)
  〜
  就像进入递归循环一样。不知道如何更新。

最佳答案

WebSecurityConfigurerAdapter包含以下方法:

public UserDetailsService userDetailsServiceBean() throws Exception


从Java Docs:


  重写此方法,以将通过configure(AuthenticationManagerBuilder)创建的UserDetailsS​​ervice公开为Bean。


因此,尝试像这样在WebSecurityConfig中覆盖此方法:

@Bean
public UserDetailsService userDetailsService() {
    return super.userDetailsService();
}

关于java - 无法自动连线。找不到UserDetailService类型的Bean,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42562893/

10-12 00:41
查看更多