2017-03-02 97 views
0

私は実行時のエラーの詳細を以下に示します。ここAutowireできませんでした。UserDetailServiceタイプのBeanは見つかりませんでした。

APPLICATION FAILED TO START


Description:

Field userDetailsService in com.word.security.WebSecurityConfig required a bean of type 'org.springframework.security.core.userdetails.UserDetailsService' that could not be found.

Action:

Consider defining a bean of type 'org.springframework.security.core.userdetails.UserDetailsService' in your configuration.

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のアイデアは以下userDetailsServiceためCould not Autowire誤差を示しています。

@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); 
     } 
    } 
} 

UPDATE

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 at org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter$UserDetailsServiceDelegator.loadUserByUsername(WebSecurityConfigurerAdapter.java:441) ~[spring-security-config-4.2.1.RELEASE.jar:4.2.1.RELEASE] at org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter$UserDetailsServiceDelegator.loadUserByUsername(WebSecurityConfigurerAdapter.java:442) ~ its like going into the recursive loop. Dont know how to update.

+0

この質問を見てください:http://stackoverflow.com/questions/33642199/spring-boot-autowired-not-working-in-configuration-class –

答えて

0

WebSecurityConfigurerAdapterこのメソッドが含まれます。Javaドキュメントから

public UserDetailsService userDetailsServiceBean() throws Exception 

を:

Override this method to expose a UserDetailsService created from configure(AuthenticationManagerBuilder) as a bean.

したがって、このようなWebSecurityConfigでこのメソッドをオーバーライドしてみてください:

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

私はもはや同じエラーがありません。しかし、今私はstackoverflowエラーを取得しています。それがなぜ起こるかあなたは考えていますか? –

+0

SecurityService.class内で同じエラーが発生しない理由 –

0

このエラーの原因の1つは、このクラスの実装がないためです。 UserDetailsS​​erviceを実装するCustomUserDetailsS​​erviceというクラスを作成し、@Componentで注釈を付けます。 詳細については、春のドキュメントを参照してください。

関連する問題