Java 具有自定义UserDetailsService的Spring引导

Java 具有自定义UserDetailsService的Spring引导,java,spring,spring-security,spring-data,spring-boot,Java,Spring,Spring Security,Spring Data,Spring Boot,将自定义的UserDetailsService实现(使用SpringDataJPA)添加到SpringBootApp的正确方法是什么 公共类数据库UserDetailsService实现UserDetailsService{ @注入 私人用户帐户服务用户帐户服务; @凌驾 public UserDetails loadUserByUsername(字符串用户名)引发UsernameNotFoundException{ User=userAccountService.getUserByEmail(

将自定义的UserDetailsService实现(使用SpringDataJPA)添加到SpringBootApp的正确方法是什么

公共类数据库UserDetailsService实现UserDetailsService{
@注入
私人用户帐户服务用户帐户服务;
@凌驾
public UserDetails loadUserByUsername(字符串用户名)引发UsernameNotFoundException{
User=userAccountService.getUserByEmail(用户名);
返回新的MyUserDetails(用户);
}
}
公共接口用户存储库扩展了JpaRepository,JpaSpecificationExecutor{
公共用户findByEmail(字符串电子邮件);
}
@服务
公共类UserAccountService{
@注入
受保护的用户存储库用户存储库;
公共用户getUserByEmail(字符串电子邮件){
返回userRepository.findByEmail(电子邮件);
}
}
@配置
@组件扫描
@启用自动配置
@EnableGlobalMethodSecurity(Prespenabled=true)
@启用事务管理
@EnableJParepositions(basePackages=“com.sample”)
@EntityScan(basePackages={“com.sample”})
@启用JPA审核(auditorAwareRef=“auditorProvider”)
公共类应用程序{
公共静态void main(字符串[]args){
SpringApplication.run(Application.class,args);
}
...
@顺序(SecurityProperty.ACCESS\u OVERRIDE\u顺序)
受保护的静态类应用程序安全性扩展了WebSecurity配置适配器{
@凌驾
受保护的无效配置(HttpSecurity http)引发异常{
http
.授权请求()
.antMatchers(“/”).hasRole(“用户”)
.及()
.formLogin()
.login页面(“/login”)
.permitAll()
.及()
.logout()
.permitAll();
}
}
@顺序(有序。最高优先级+10)
受保护的静态类身份验证安全性扩展了GlobalAuthenticationConfigurerAdapter{
@注入
私人用户帐户服务用户帐户服务;
@凌驾
public void init(AuthenticationManagerBuilder auth)引发异常{
auth.userDetailsService(userDetailsService());
}
@豆子
公共用户详细信息服务用户详细信息服务(){
返回新的DatabaseUserDetailsService();
}
}
}
@实体
公共类用户扩展了可抽象持久化{
@许多
私有列表角色=新的ArrayList();
//盖特,塞特
}
@实体
公共类角色扩展了可抽象持久化{
@列(nullable=false)
私人字符串管理机构;
//盖特,塞特
}
我无法启动应用程序,因为我收到了(此处完全例外)


当我使用
auth.jdbc authentication().dataSource(dataSource).usersByUsernameQuery(“…).authoritiesByUsernameQuery(“…”)配置我的
应用程序安全性
时,一切都在运行,包括JPA和Spring数据存储库。

你的应用程序似乎适合我(一旦我将
@Configuration
添加到
AuthenticationSecurity
)中,下面是另一个使用JPA
UserDetailsService
的简单应用程序的工作示例,以防它有所帮助:

您也可以按照它来实现自定义用户详细信息服务

这个例子展示了如何将bean发送到userdetails服务进行注入

  • 在WebSecurity配置器中自动连接存储库
  • 通过参数化构造函数将此bean作为参数发送给用户详细信息服务
  • 将其分配为私有成员并用于从数据库加载用户

  • 问题是JPA映射。请添加用户和角色实体(类).Entities添加。无论如何,我不认为Entities有问题,因为JPA在没有我的UserDetails服务的情况下运行良好。不过,我认为Evgeni是对的。错误是映射错误。也许你可以共享一个完整的项目?@DaveSyer,我尝试在这里最小化它。仍然无法运行,但我在D中遇到另一个异常NPE-UserAccountServiceatabaseUserDetailsService为空。请尝试,您可能知道如何使用自定义UserDetailsService:)您的应用似乎适合我(一旦我将@Configuration添加到AuthenticationSecurity中)。我如何打破它?谢谢,这有助于前进。但现在我得到了
    o.s.s.w.a.www.BasicAuthenticationFilter:Authentication请求失败:org.springframework.security.Authentication.InternalAuthenticationServiceException:未能延迟初始化角色集合:com.sample.model.User.roles,无法初始化代理-否会话
    。但是,我没有找到任何使用延迟抓取加载角色的示例。我更新了我的github示例。延迟角色听起来不是个好主意(身份验证后,您总是需要检查授权),但这看起来好像你没有事务。也许
    UserDetailsService
    是事务性的,并加载角色,一箭双雕,可以说?@DaveSyer您好,我不明白您的意思。我与OP有相同的错误(
    未能懒洋洋地初始化角色集合
    )。我应该将
    fetch=FetchType.EAGER
    添加到
    com.sample.model.User.roles
    中吗?还是有一种不太重的方法?谢谢!理想情况下,您不应该使用JPA获取用户详细信息。如果您必须在
    UserDetailsService
    中获取角色(并使其具有事务性)。
    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)