美文网首页
spring security + Oauth2 内部2个子系统

spring security + Oauth2 内部2个子系统

作者: cjlynn | 来源:发表于2021-01-26 14:44 被阅读0次

改写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());
        

当然这是其中一种解决方案,如果有更好的方案欢迎分享。

相关文章

网友评论

      本文标题:spring security + Oauth2 内部2个子系统

      本文链接:https://www.haomeiwen.com/subject/iypgzktx.html