为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

湖上湖 2023-07-28 15:27:06
我是 Spring Security 的新手。我有一个带有两种不同类型实体的 Spring Boot 应用程序。客户和员工。在员工中,我有普通员工、管理员和超级用户。由于我使用 JPA,每个实体都有自己的repository. 如何对我的模型进行建模UserDetailsService,loadUserByUsername因为这是针对许多存储库进行验证的常用方法。我是否缺少任何围绕我的实体建模的东西?附加信息:在我的设计中,我有两个实体。Customer和Employee。Employee将有诸如NORMAL、ADMIN和 之类的角色SUPER_USER。客户是一个不同的实体。是否会有两个UserDetailsService和两个 AuthenticationProvider 分别指向自己的表(Customer 和 Employee)?
查看完整描述

2 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

由于您的要求是拥有多个身份验证入口点,因此它并不像 Atul 的答案那么简单。

你需要的是

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

  2. 您需要实现自定义身份验证过滤器,即实现UsernamePasswordAuthenticationFilter代替 spring-security 提供的默认值.formLogin()

  3. 创建两个UsernamePasswordAuthenticationTokenasEmployeeUsernamePasswordAuthenticationTokenCustomerUsernamePasswordAuthenticationToken

  4. 在您的自定义过滤器中,从请求中获取 userType,并根据 userType 将 authToken 设置为 empAuthToken 或 customerAuthToken 以区分所需的身份验证提供程序。

  5. 创建AuthenticationProviderEmployeeCustomAuthenticationProviderCustomerCustomAuthenticationProvider在每个AuthenticationProvider应该重写的地方支持方法,其中 AuthenticationProvider 支持特定令牌(customerAuthToken 或 employeeAuthToken)。

  6. 覆盖身份验证方法,其中身份验证方法已通过身份验证参数传递,您可以从中获取用户名和密码,您可以将其传递给任何自定义服务以对用户进行身份验证并授予用户所需的权限。

在实现 CustomAuthenticationFilter 时,还需要提供自定义的authenticationSuccessHandler 和 AuthenticationFailureHandlers。

如果您实现上述所有内容而没有任何错误,则可以避免在配置了两个 customAuthenticationProvider 的情况下 spring-security 默认提供的回退身份验证。

查看完整回答
反对 回复 2023-07-28
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

“是否会有两个 UserDetailsService 和两个 AuthenticationProvider 分别指向自己的表(Customer 和 Employee)?” ......答案是肯定的。

Spring security有过滤器,UsernamePasswordAuthenticationFilter(检查过滤器的名称),您可以根据输入类型来实现具体的实现。

我做了同样的事情,但是针对不同的身份验证机制。但根据您的要求,这可能是您想要的。


查看完整回答
反对 回复 2023-07-28
  • 2 回答
  • 0 关注
  • 119 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信