猿问

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

我是 Spring Security 的新手。我有一个带有两种不同类型实体的 Spring Boot 应用程序。客户和员工。在员工中,我有普通员工、管理员和超级用户。由于我使用 JPA,每个实体都有自己的repository. 如何对我的模型进行建模UserDetailsServiceloadUserByUsername因为这是针对许多存储库进行验证的常用方法。我是否缺少任何围绕我的实体建模的东西?

附加信息:

在我的设计中,我有两个实体。CustomerEmployeeEmployee将有诸如NORMALADMIN和 之类的角色SUPER_USER。客户是一个不同的实体。

是否会有两个UserDetailsService和两个 AuthenticationProvider 分别指向自己的表(Customer 和 Employee)?


湖上湖
浏览 120回答 2
2回答

眼眸繁星

由于您的要求是拥有多个身份验证入口点,因此它并不像 Atul 的答案那么简单。你需要的是您需要在登录时区分客户和员工。(首选方式单选按钮)您需要实现自定义身份验证过滤器,即实现UsernamePasswordAuthenticationFilter代替 spring-security 提供的默认值.formLogin()创建两个UsernamePasswordAuthenticationTokenasEmployeeUsernamePasswordAuthenticationToken和CustomerUsernamePasswordAuthenticationToken在您的自定义过滤器中,从请求中获取 userType,并根据 userType 将 authToken 设置为 empAuthToken 或 customerAuthToken 以区分所需的身份验证提供程序。创建AuthenticationProvider为EmployeeCustomAuthenticationProvider并CustomerCustomAuthenticationProvider在每个AuthenticationProvider应该重写的地方支持方法,其中 AuthenticationProvider 支持特定令牌(customerAuthToken 或 employeeAuthToken)。覆盖身份验证方法,其中身份验证方法已通过身份验证参数传递,您可以从中获取用户名和密码,您可以将其传递给任何自定义服务以对用户进行身份验证并授予用户所需的权限。在实现 CustomAuthenticationFilter 时,还需要提供自定义的authenticationSuccessHandler 和 AuthenticationFailureHandlers。如果您实现上述所有内容而没有任何错误,则可以避免在配置了两个 customAuthenticationProvider 的情况下 spring-security 默认提供的回退身份验证。

胡说叔叔

“是否会有两个 UserDetailsService 和两个 AuthenticationProvider 分别指向自己的表(Customer 和 Employee)?” ......答案是肯定的。Spring security有过滤器,UsernamePasswordAuthenticationFilter(检查过滤器的名称),您可以根据输入类型来实现具体的实现。我做了同样的事情,但是针对不同的身份验证机制。但根据您的要求,这可能是您想要的。
随时随地看视频慕课网APP

相关分类

Java
我要回答