我想使用两种类型的用户:普通用户和管理员。现在我已经有了一个基础架构,其中管理员和用户是两种完全不同的类型:用户有许多只与他们相关的东西(控制器、表、服务等),管理员也是如此。因此,它们在数据库中是不同的实体和不同的表,我不想组合它们,因为它们是不同的。但现在只有用户可以使用Spring Security OAuth2登录,但管理员不是主体,他们不能登录。请注意,我使用自己的授权和资源服务器。
因此,我希望允许Spring Security对用户和管理员进行身份验证。我还想为用户和管理员使用两个不同的登录端点和两个不同的实体和表。
如何才能做到这一点,或者我应该怎么做?
更新:
我想我应该创建两个OAuth客户端,在oauth_client_details
中使用两个不同的grant_types
,并为用户和管理员创建两个AbstractTokenGranters
。
我已经有一个针对用户的自定义AbstractTokenGranter
,它像这样对用户进行身份验证:
//getOAuth2Authentication()
User user = userService.getUserByPhone(username);
if(user == null)
throw new BadCredentialsException("Bad credentials");
Authentication authentication = authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(Long.toString(user.getId()), password)
);
//I use Long.toString(user.getId()) because some users use FB instead of the phone,
//so I have one more `AbstractTokenGranter` for social networks,
//I don't mention about it in this post, so don't be confused
据我所知,AuthenticationManager
调用UserDetailsService
,它现在看起来像这样:
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
UserDetails user = userRepository.findById(Long.parseLong(username)).orElseThrow(
() -> new UsernameNotFoundException("User not found with id : " + id)
);
return user;
}
但是如果我为管理员再创建一个AbstractTokenGranter
,那么当前的UserDetailsService
将不知道它收到了谁的id -管理员id或用户id。
作为一种解决方案,我认为我需要为管理员再创建一个UserDetailsService
。但是如何使用多个UserDetailsService
呢?另外,也许我应该使用一个完全不同的方案?
https://stackoverflow.com/questions/57400607
复制相似问题