2 回答
TA贡献1873条经验 获得超9个赞
由于您的要求是拥有多个身份验证入口点,因此它并不像 Atul 的答案那么简单。
你需要的是
您需要在登录时区分客户和员工。(首选方式单选按钮)
您需要实现自定义身份验证过滤器,即实现
UsernamePasswordAuthenticationFilter
代替 spring-security 提供的默认值.formLogin()
创建两个
UsernamePasswordAuthenticationToken
asEmployeeUsernamePasswordAuthenticationToken
和CustomerUsernamePasswordAuthenticationToken
在您的自定义过滤器中,从请求中获取 userType,并根据 userType 将 authToken 设置为 empAuthToken 或 customerAuthToken 以区分所需的身份验证提供程序。
创建
AuthenticationProvider
为EmployeeCustomAuthenticationProvider
并CustomerCustomAuthenticationProvider
在每个AuthenticationProvider
应该重写的地方支持方法,其中 AuthenticationProvider 支持特定令牌(customerAuthToken 或 employeeAuthToken)。覆盖身份验证方法,其中身份验证方法已通过身份验证参数传递,您可以从中获取用户名和密码,您可以将其传递给任何自定义服务以对用户进行身份验证并授予用户所需的权限。
在实现 CustomAuthenticationFilter 时,还需要提供自定义的authenticationSuccessHandler 和 AuthenticationFailureHandlers。
如果您实现上述所有内容而没有任何错误,则可以避免在配置了两个 customAuthenticationProvider 的情况下 spring-security 默认提供的回退身份验证。
TA贡献1804条经验 获得超8个赞
“是否会有两个 UserDetailsService 和两个 AuthenticationProvider 分别指向自己的表(Customer 和 Employee)?” ......答案是肯定的。
Spring security有过滤器,UsernamePasswordAuthenticationFilter(检查过滤器的名称),您可以根据输入类型来实现具体的实现。
我做了同样的事情,但是针对不同的身份验证机制。但根据您的要求,这可能是您想要的。
添加回答
举报