我是Spring Security的新手。我有一个具有两种不同类型的实体的 Spring Boot 应用程序。客户和员工。在员工中,我有普通员工、管理员和超级用户。由于我使用的是 JPA,因此每个实体都有自己的repository
。如何使用loadUserByUsername
对我的UserDetailsService
进行建模,因为这是针对许多存储库进行验证的常用方法。我是否缺少围绕我的实体建模的内容?
附加信息:
在我的设计中,我有两个实体。Customer
和Employee
.Employee
将扮演NORMAL
、ADMIN
和SUPER_USER
等角色。客户是一个不同的实体。
是否会有两个UserDetailsService
和两个身份验证提供程序,分别指向自己的表(客户和员工(?
由于您的要求是具有多个身份验证入口点,因此它并不像 Atul 的答案那么简单。
你需要
的是
-
您需要在登录时区分客户和员工。(首选方式单选按钮(
-
您需要实现自定义身份验证过滤器,即实现
UsernamePasswordAuthenticationFilter
而不是 spring-security 提供的默认.formLogin()
-
创建两个
UsernamePasswordAuthenticationToken
作为EmployeeUsernamePasswordAuthenticationToken
和CustomerUsernamePasswordAuthenticationToken
-
在自定义筛选器中,从请求中获取用户类型,并根据用户类型将身份验证令牌设置为empAuthToken或客户身份验证令牌,以区分所需的身份验证提供程序。
-
创建
AuthenticationProvider
作为EmployeeCustomAuthenticationProvider
和CustomerCustomAuthenticationProvider
,其中应覆盖每个AuthenticationProvider
支持身份验证提供程序支持特定令牌 customerAuthToken 或 employeeAuthToken 的方法。
覆盖身份验证方法, 其中身份验证方法已使用身份验证参数传递,您可以从中获取用户名和密码,您可以将用户名和密码传递给任何自定义服务以对用户进行身份验证并授予用户所需的权限。
在实现 CustomAuthenticationFilter 时,还需要提供 Custom authenticationSuccessHandler 和 AuthenticationFailureHandlers。
如果您毫无错误地实现了上述所有内容,则可以避免回退身份验证,如果配置了两个自定义身份验证提供程序,则 spring-security 默认提供回退身份验证。
有关使用 java 配置实现多个身份验证入口点的更多详细信息,请参阅下面给出的答案 具有不同用户名密码身份验证令牌的多个身份验证提供程序,无需回退身份验证即可验证不同的登录表单
您也可以从我的GitHub存储库下载工作代码
"是否会有两个UserDetailsService和两个AuthenticationProvider,每个都指向自己的表(客户和员工(?"答案是肯定的。
Spring 安全有过滤器,用户名密码身份验证过滤器(检查过滤器的名称(,您可以在其中根据输入类型实现特定的实现。
我做了同样的事情,但针对不同的身份验证机制。 但根据您的要求,这可能是您寻找的东西。