Помощь со Spring Security/MVC

125
09 июня 2019, 00:40

Пытаюсь разбираться со спрингом постепенно создавая пет проект. У меня есть 2 Entity: User, Role. Они связаны ManyToMany.

Вот кусок связи из класса User:

 @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinTable(name = "user_role", joinColumns = {@JoinColumn(name = "user_id")},
            inverseJoinColumns = {@JoinColumn(name = "role_id")})
    private Set<Role> roles = new HashSet<>();

Добавляю в проект Spring Security. Когда тестировал с

@Bean
    @Override
    public UserDetailsService userDetailsService() {
        UserDetails user =
             User.withDefaultPasswordEncoder()
                .username("user")
                .password("password")
                .roles("USER")
                .build();
        return new InMemoryUserDetailsManager(user);
    }

и авторизовался по этим данным, то все окай, Когда по гайдам реализовал свой UserDetailsService

@Service
public class UserService implements UserDetailsService {
    @Autowired
    IUserRepository userRepo;
    @Override
    public UserDetails loadUserByUsername(final String username) throws UsernameNotFoundException {
        return userRepo.getByLogin(username);
    }
}

И в конфиге Spring Security заменил на него, то при попытке авторизоваться имею вот такую ошибку:

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
There was an unexpected error (type=Internal Server Error, status=500).
failed to lazily initialize a collection of role: com.pet.model.User.roles, could not initialize proxy - no Session

Сессия закрывается и не читает данные ролей пользователей. Кто может посоветовать как решить траблу? Роли лежат в Бд, класс Role - Entity. Что пробовал: 1. Менять LAZY на EAGER - ошибка "No message available"; 2. Пробовал проставть над сервисами @Transactional. - толку ноль.

В проекте Spring Data JPA. Пробовал добавить SQL запросом юзера, потом роль и связать их. После этого в тесте хотел получить его роль (user.getRoles() который возвращает сет) имею всегда ошибку.

Answer 1

Проблема решилась иным способом. Пришлось создать отдельный репозиторий для ролей и подгружать роли из базы.

READ ALSO
Ошибка при работе с MutableLiveData: non-static method getInstance() cannot be referenced from a static context

Ошибка при работе с MutableLiveData: non-static method getInstance() cannot be referenced from a static context

Я пытаюсь создать некий Repository для хранения данных между событиями жизненного цикла Android приложенияСледую архитектуре паттерна MVVM, также...

118
Немного о чистом коде

Немного о чистом коде

Приветсвую, есть у меня в коде класс ConfirmDialog, цель которого при нажатии кнопки Продолжить, выполнить действие, а при нажатии отмена, убрать...

111
Анимация планет солнечной системы

Анимация планет солнечной системы

У меня есть картинка планет солнечной системы

154