将我的UserDetailsService的自定义实现(使用Spring Data JPA)添加到Spring Boot应用程序的正确方法是什么?
public class DatabaseUserDetailsService implements UserDetailsService { @Inject private UserAccountService userAccountService; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { User user = userAccountService.getUserByEmail(username); return new MyUserDetails(user); } } public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> { public User findByEmail(String email); } @Service public class UserAccountService { @Inject protected UserRepository userRepository; public User getUserByEmail(String email) { return userRepository.findByEmail(email); } } @Configuration @ComponentScan @EnableAutoConfiguration @EnableGlobalMethodSecurity(prePostEnabled = true) @EnableTransactionManagement @EnableJpaRepositories(basePackages = "com.sample") @EntityScan(basePackages = { "com.sample" }) @EnableJpaAuditing(auditorAwareRef = "auditorProvider") public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } ... @Order(SecurityProperties.ACCESS_OVERRIDE_ORDER) protected static class ApplicationSecurity extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/").hasRole("USER") .and() .formLogin() .loginPage("/login") .permitAll() .and() .logout() .permitAll(); } } @Order(Ordered.HIGHEST_PRECEDENCE + 10) protected static class AuthenticationSecurity extends GlobalAuthenticationConfigurerAdapter { @Inject private UserAccountService userAccountService; @Override public void init(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService()); } @Bean public UserDetailsService userDetailsService() { return new DatabaseUserDetailsService(); } } } @Entity public class User extends AbstractPersistable<Long> { @ManyToMany private List<Role> roles = new ArrayList<Role>(); // getter, setter } @Entity public class Role extends AbstractPersistable<Long> { @Column(nullable = false) private String authority; // getter, setter }
我无法启动应用程序,因为我得到了(此处为完整异常http://pastebin.com/gM804mvQ)
Caused by: org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: com.sample.model.User.roles[com.sample.model.Role] at org.hibernate.cfg.annotations.CollectionBinder.bindManyToManySecondPass(CollectionBinder.java:1134)
如果我在配置ApplicationSecurity与auth.jdbcAuthentication().dataSource(dataSource).usersByUsernameQuery("...).authoritiesByUsernameQuery("...")一切工作,包括JPA和Spring数据存储库。
ApplicationSecurity
auth.jdbcAuthentication().dataSource(dataSource).usersByUsernameQuery("...).authoritiesByUsernameQuery("...")
您的应用似乎对我有用(一旦添加@Configuration到AuthenticationSecurity)。这是使用JPA的简单应用程序的另一个工作示例,UserDetailsService以防它有所帮助:https : //github.com/scratches/jpa-method-security- sample
@Configuration
AuthenticationSecurity
UserDetailsService