Java 针对客户和员工的Spring Security用户身份验证

Java 针对客户和员工的Spring Security用户身份验证,java,spring,jakarta-ee,spring-security,spring-security-rest,Java,Spring,Jakarta Ee,Spring Security,Spring Security Rest,我是春天安全的新手。我有一个Spring启动应用程序,它有两种不同类型的实体。客户和员工。在雇员中,我有普通雇员、管理员和超级用户。由于我使用JPA,每个实体都有自己的存储库。如何使用loadUserByUsername对myUserDetailsService建模,因为这是针对许多存储库进行验证的常用方法。在我的实体周围,我缺少什么可以建模的东西吗 其他信息: 在我的设计中,我有两个实体客户和员工员工将扮演普通、管理员和超级用户等角色。客户是一个不同的实体 是否有两个UserDetailsSe

我是春天安全的新手。我有一个Spring启动应用程序,它有两种不同类型的实体。客户和员工。在雇员中,我有普通雇员、管理员和超级用户。由于我使用JPA,每个实体都有自己的
存储库
。如何使用
loadUserByUsername
对my
UserDetailsService
建模,因为这是针对许多存储库进行验证的常用方法。在我的实体周围,我缺少什么可以建模的东西吗

其他信息:

在我的设计中,我有两个实体<代码>客户和员工<代码>员工将扮演
普通
管理员
超级用户
等角色。客户是一个不同的实体

是否有两个
UserDetailsService
和两个AuthenticationProvider分别指向自己的表(客户和员工)?

“是否有两个UserDetailsService和两个AuthenticationProvider分别指向自己的表(客户和员工)?”。。。。。答案是肯定的

Spring security具有筛选器UsernamePasswordAuthenticationFilter(检查筛选器的名称),您可以在其中根据输入类型实现特定的实现

我做了同样的事情,但不同的身份验证机制。
但根据您的要求,您可能需要什么。

因为您的要求是拥有多个身份验证入口点,所以它不像Atul的答案那么简单

您需要的是

  • 您需要在登录时区分客户和员工。(首选方式单选按钮)

  • 您需要实现自定义身份验证筛选器,即,实现
    UsernamePasswordAuthenticationFilter
    而不是spring security提供的默认
    .formLogin()

  • 创建两个
    UsernamePasswordAuthenticationToken
    作为
    EmployeeUsernamePasswordAuthenticationToken
    CustomerNamePasswordAuthenticationToken

  • 在自定义筛选器中,从请求获取用户类型并基于用户类型将authToken设置为empAuthToken或customerAuthToken以区分所需的身份验证提供程序

  • 创建
    AuthenticationProvider
    EmployeeCustomAuthenticationProvider
    CustomerCustomAuthenticationProvider
    其中每个
    AuthenticationProvider
    都应被覆盖,并支持AuthenticationProvider支持特定令牌customerAuthToken或employeeAuthToken的方法

  • 重写authenticate method,其中authenticate method已通过身份验证参数传递,您可以从中获取用户名和密码,您可以将用户名和密码传递给任何自定义服务,以对用户进行身份验证并授予用户所需的权限

  • 在实现CustomAuthenticationFilter时,还需要提供自定义authenticationSuccessHandler和AuthenticationFailureHandler

    如果您实现了以上所有功能,并且没有任何错误,那么您就可以避免回退身份验证,如果配置了两个customAuthenticationProviders,spring security将默认提供回退身份验证

    有关使用java配置实现多身份验证入口点的更多详细信息,请参阅下面给出的答案


    你也可以

    你的问题很窄,但你的问题中缺少更大的要求。在提出问题之前,我建议你们收集需求。让我帮你问个问题。您有不同的用户集吗?客户作为不同的实体,员工作为不同的实体。员工可以担任
    员工
    管理员
    超级用户
    。如果将employee、admin和superuser表分开,这将是一个糟糕的设计。我建议您为员工、管理员和超级用户设置一个实体/表。您可以为客户设置单独的实体/表。您是否为客户和员工提供了单独的登录界面。我认为您需要为员工和客户提供单独的登录页面/表单。“我说的对吗?”Praveenkumarlasangi在问题中补充了细节