改写UserDetailsServiceImpl来实现不同的系统登录进来的用户,访问不同的库
spring cloud分布式微服务,尽量解耦所有业务,以方便拆分扩展,分布式。
在我们的业务系统中碰到一种场景,内部子服务中,有2个子系统分别是不同的用户登录,注册用户和管理员访问的是不同的子系统,用户和管理员现在用的是一张表,但是又只需要用一个登录服务,不同子系统又拥有独立的权限。
在网上没有找到解决方案,但是提供了一个思路,在网上找到了这样一篇文章 使用oauth2时,用户和管理员是分开存的,不同的表,oauth2怎么配置,看评论提到用scope来做,于是改写我们的UserDetailsServiceImpl,当然spring security + Oauth2的案例网上很多这里,就不详述了。
通过改写UserDetailsServiceImpl来实现不同的系统登录进来的用户,访问不同的库,得到不同的用户权限。
@Override
public UserDetails loadUserByUsername(String username)
{
ClientDetailsService clientDetailsService = SpringUtils.getBean(ClientDetailsService.class);
User details = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
ClientDetails clientDetails = clientDetailsService.loadClientByClientId(details.getUsername());
R<UserInfo> userResult = null;
if(clientDetails.getScope().contains(SCOPE_CLIENT)) {
userResult = remoteUserService.getUserInfoConfole(username);
} else {
userResult = remoteUserService.getUserInfo(username);
}
checkUser(userResult, username);
UserPermission userPermission = null;
if(clientDetails.getScope().contains(SCOPE_CLIENT)) {
userPermission = remoteClientUserPermissionService.selectConsoleUserPermissionByUserId(userResult.getData().getSysUser().getUserId());
}
return getUserDetails(userResult, userPermission, clientDetails);
}
主要思路就是,子系统分别定义不同的scope,在loadUserByUsername的时候拿到ClientDetails,这样从不同子系统过来的请求,查询不同的用户权限。这样就可以达到不同用户,不同系统的不同权限的分离。
ClientDetailsService clientDetailsService = SpringUtils.getBean(ClientDetailsService.class);
User details = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
ClientDetails clientDetails = clientDetailsService.loadClientByClientId(details.getUsername());
当然这是其中一种解决方案,如果有更好的方案欢迎分享。