java - 带有自定义 UserDetailsS​​ervice 的 Spring Boot

标签 java spring spring-security spring-data spring-boot

将我的 UserDetailsS​​ervice(使用 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

}

我无法启动应用程序,因为我得到了(此处完全异常(exception) 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)

当我使用 auth.jdbcAuthentication().dataSource(dataSource).usersByUsernameQuery("...).authoritiesByUsernameQuery("...") 配置我的 ApplicationSecurity一切正常,包括 JPA 和 Spring Data 存储库。

最佳答案

您的应用似乎对我有用(一旦我将 @Configuration 添加到 AuthenticationSecurity)。这是另一个使用 JPA UserDetailsS​​ervice 的简单应用程序的工作示例,以防万一:https://github.com/scratches/jpa-method-security-sample

关于java - 带有自定义 UserDetailsS​​ervice 的 Spring Boot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24723201/

相关文章:

java - 我如何每 10 秒显示一个字符串中的一个随机单词?

java - 你觉得有必要把id字段标记为insertable = false和updatable = false吗?

java - Web 应用程序项目中的内部服务器错误

java - 如何更改我的 log4j2.xml RollingFile 设置

java - Spring 创建两个 @Configuration bean 启动

java - Spring PropertySource 在 JUnit 测试中不起作用

java - JSP 文件中的拦截器、图 block 、注释和自定义包含

java - Spring Boot 中的 ACL 安全性

spring - 使用Spring Security Rest插件时出现问题

java - Spring Security 测试期间的空身份验证