Ошибка создания бина с именем 'webSecurityConfig', так как бина UserService не существует, когда я пытаюсь автоматически подключить его к WebSecurityConfig - PullRequest
0 голосов
/ 12 марта 2019

Все примеры безопасности Spring mvc + hibernate + spring говорят, что мне нужно создать класс MyUserService, который расширяет UserDetailsService из springSecurity, чтобы связать мою базу данных с защитой Spring. Но когда я делаю это, я получаю: Ошибка создания компонента с именем 'webSecurityConfig', такой компонент UserSerivce не определен, потому что он еще не существует, когда я пытаюсь автоматически связать его с SecurityConfig. Когда я загружаю любой онлайн пример, выдается та же ошибка.

Мой проект в Git - ветка start_over.

Мой класс WebSecurityConfig:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {


@Autowired
private UserService userService;


@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(userService).passwordEncoder(passwordEncoder());
}


@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests().antMatchers("/login", "/").anonymous()
            .antMatchers("/admin", "/admin**").hasRole("ADMIN")
            .anyRequest().authenticated()
            .and()
            .formLogin().loginPage("/login").permitAll()
            .and()
            .logout().logoutSuccessUrl("/login").permitAll()
            .and()
            .csrf().disable();
}

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

}

мой UserService:

public interface UserService extends UserDetailsService {

    void save(User user);

    List<User> getAllUsers();
}

my UserServiceImpl

@Service
public class UserServiceImp implements UserService{

    @Autowired
    private UserDao userDao;

    @Transactional
    public void save(User user) {
        userDao.save(user);
    }

    @Transactional(readOnly = true)
    public List<User> getAllUsers() {
        return userDao.getAllUsers();
    }

    @Transactional(readOnly=true)
    @Override
    public UserDetails loadUserByUsername(final String username)
            throws UsernameNotFoundException {

        com.rjproject.entities.User user = userDao.findByUserName(username);
        List<GrantedAuthority> authorities =
                buildUserAuthority(user.getAuthorities());

        return buildUserForAuthentication(user, authorities);

    }

    private org.springframework.security.core.userdetails.User buildUserForAuthentication(com.rjproject.entities.User user,
                                                                                          List<GrantedAuthority> authorities) {
        return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(),
                user.isEnabled(), true, true, true, authorities);
    }

    private List<GrantedAuthority> buildUserAuthority(Set<Authorities> userRoles) {

        Set<GrantedAuthority> setAuths = new HashSet<GrantedAuthority>();

        // Build user's authorities
        for (Authorities userRole : userRoles) {
            setAuths.add(new SimpleGrantedAuthority(userRole.getAuthority()));
        }

        List<GrantedAuthority> Result = new ArrayList<GrantedAuthority>(setAuths);

        return Result;
    }
}

UPD:

У меня есть класс RunJob, который создает пользователей при запуске, и UserService автоматически подключается туда без ошибок. Вот оно:

@Service
public class RunJob implements InitializingBean {

    private static final Logger logger = Logger.getLogger(RunJob.class);
    @Autowired
    private UserService userService;

    public void afterPropertiesSet() {

        User userA = new User();
        userA.setUsername("ARS");
        userA.setPassword("ART");
        Authorities authorityA = new Authorities();
        authorityA.setAuthority("ADMIN");
        authorityA.setUser(userA);
        Set<Authorities> roles = new HashSet<>();
        roles.add(authorityA);
        userA.setAuthorities(roles);
        userService.save(userA);
        logger.info("user " + userA.getUsername() + " " + userA.getPassword() + " is saved with " + authorityA.getAuthority() + " authority");

        User userB = new User();
        userB.setUsername("John");
        userB.setPassword("Doe");
        Authorities authorityB = new Authorities();
        authorityB.setAuthority("USER");
        authorityB.setUser(userB);
        roles.clear();
        roles.add(authorityB);
        userB.setAuthorities(roles);
        userService.save(userB);
        logger.info("user " + userB.getUsername() + " " + userB.getPassword() + " is saved with " + authorityB.getAuthority() + " authority");
    }
}

Я получаю точно такую ​​же ошибку при загрузке любого онлайн-примера. Что-то с самой SpringSecurity. UPD2: здесь все конфиг-классы.

webMvcConfig

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"com.rjproject"})
public class WebMvcConfig implements WebMvcConfigurer {

    @Autowired
    private ApplicationContext applicationContext;

    @Bean
    public SpringResourceTemplateResolver templateResolver() {
        SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
        templateResolver.setApplicationContext(applicationContext);
        templateResolver.setPrefix("/WEB-INF/templates/");
        templateResolver.setSuffix(".html");
        templateResolver.setTemplateMode(TemplateMode.HTML);
        templateResolver.setCacheable(true);
        return templateResolver;
    }

    @Bean
    public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(templateResolver());
        templateEngine.setEnableSpringELCompiler(true);
        return templateEngine;
    }

    @Bean
    public ViewResolver viewResolver() {
        ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
        viewResolver.setTemplateEngine(templateEngine());
        return viewResolver;
    }

    @Override
    public void addResourceHandlers(final ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
    }
}

WebAppInit

public class WebAppInit extends AbstractAnnotationConfigDispatcherServletInitializer {


    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] { HibernateConfig.class, WebSecurityConfig.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] { WebMvcConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

Если в вашем проекте есть несколько классов конфигурации, например, у меня есть WebMvcConfig и WebSecurityConfig, вы должны определить аннотацию @ComponentScan(basePackages = {"com.rjproject"}) для каждого класса конфигурации.

0 голосов
/ 12 марта 2019

1: в вашем случае (javaconfig) вы должны определить Bean-компонент, который возвращает объект userService, где он определен?!

2: Другой способ, я думаю, если вы добавите метод установки для userService в WebSecurityConfig классе, тогда проблема будет решена! просто так

public void setUserService(UserService userService){
     this.userService = userService;
}

и следующий шаг здесь, при реализации класса из интерфейса UserService вы должны добавить аннотацию @Service над классом и установить атрибут 'value' @Service в "userService".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...