Я хочу использовать свою собственную схему БД с Spring Security, сохраняя при этом большую часть кода платформы. Я хочу использовать postgres, где моя таблица пользователей находится в ее схеме: profiles.users. Моя конфигурация безопасности:
@Configuration
public class SecurityConfigDev extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Autowired
private DataSource dataSource;
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
// authentication
@Override
protected void configure(AuthenticationManagerBuilder authBuilder) throws Exception {
authBuilder
.jdbcAuthentication()
.dataSource(dataSource)
.usersByUsernameQuery("select username, password from profiles.users where username=?")
.withUser(User
.withUsername("username")
.password(passwordEncoder().encode("username"))
.roles("USER")
)
.and()
.userDetailsService(userDetailsService)
.passwordEncoder(passwordEncoder());
}
...
}
Я написал свой собственный UserService, который реализует UserDetailsService, который обрабатывает бизнес-логику, связанную с пользователем, получает данные из базы данных и правильно вводится.
Проблема в том, что фреймворк использует жестко закодированные запросы из JdbcUserDetailsManager, которые мне нужно изменить (я мог бы легко расширить этот класс, переопределить статические методы и внедрить его), поэтому в этом случае, я думаю, я бы просто расширил JdbcUserDetailsManagerс моими UserDetails?
JdbcUserDetailsManager:
// UserDetailsManager SQL
public static final String DEF_CREATE_USER_SQL = "insert into users (username, password, enabled) values (?,?,?)";
public static final String DEF_DELETE_USER_SQL = "delete from users where username = ?";
public static final String DEF_UPDATE_USER_SQL = "update users set password = ?, enabled = ? where username = ?";
public static final String DEF_INSERT_AUTHORITY_SQL = "insert into authorities (username, authority) values (?,?)";
public static final String DEF_DELETE_USER_AUTHORITIES_SQL = "delete from authorities where username = ?";
...etc...
Это был бы "правильный" способ сделать это? Кажется, на данный момент у меня есть два bean-компонента, которые реализуют userDetailsService, и, поскольку мой UserService внедряется в authBuilder, почему я не получаю некоторые ошибки времени компиляции с отсутствующими методами?
PS: У меня также есть UserRepositoryкоторый обрабатывает фактические запросы jdbc и который внедряется в UserService