返回介绍

6.5 共享资源服务

发布于 2025-04-26 13:26:34 字数 3960 浏览 0 评论 0 收藏

实例工程的共享资源模块,可以为已经授权的用户提供一些共享信息服务。代码清单 6-13 是共享资源模块的主程序,它使用注解 @EnableResourceServer 来标注这个应用是一个资源服务器。

代码清单 6-13 资源服务器主程序

@SpringBootApplication
@EnableResourceServer
@ComponentScan(basePackages = "com.test")
public class ResourceApplication {
    public static void main(String[] args) {
        SpringApplication.run(ResourceApplication.class, args);
    }
}

一个应用被标注为资源服务器后,在浏览器中就不能直接访问,如果在浏览器上打开这样的客户端,将只能看到如图 6-1 所示的提示信息。

图 6-1 在浏览器中打开资源服务器的情况

6.5.1 提供共享资源接口

启用资源服务器功能之后,就能够对外提供资源信息服务。代码清单 6-14 是一个共享登录用户信息的接口设计,这是提供了一个“/user”链接的控制器,程序中通过 Principal 取得登录用户的用户名,然后通过用户名在数据库中查出用户的详细信息,最后返回包含用户信息的一个 Map 对象。

代码清单 6-14 共享用户信息接口设计

@Autowired
    private UserRepository userRepository;
    @RequestMapping("/user")
    public Map<String, Object> user(Principal puser) {
        User user = userRepository.findByName(puser.getName());
        Map<String, Object> userinfo = new HashMap<>();
        userinfo.put("id", user.getId());
        userinfo.put("name",user.getName());
        userinfo.put("email", user.getEmail());
        userinfo.put("department",user.getDepartment().getName());
        userinfo.put("createdate", user.getCreatedate());
        return userinfo;
    }

6.5.2 使用共享资源

在客户端中要使用资源服务器的共享信息,可以使用 spring-cloud-zuul 提供的一个路由服务来实现。代码清单 6-15 是客户端应用 2 的主程序,它使用注解 @EnableZuulProxy 来启用 Zuul 路由代理服务。

代码清单 6-15 客户端应用 2 的主程序

@SpringBootApplication
@EnableZuulProxy
@ComponentScan(basePackages = "com.test")
public class Web2Application {
    public static void main(String[] args) {
        SpringApplication.run(Web2Application.class, args);
    }
}

在工程配置文件 application.yml 中使用如代码清单 6-16 所示的配置,配置一个路由资源,其中 path 设定资源的访问路径,url 指定路由的服务方。

代码清单 6-16 使用资源服务的路由配置

zuul:
    routes:
        resource:
            path: /resource/**
            url: http://localhost:8083
            stripPrefix: true
            retryable: true

这样就可以在客户端应用 2 中使用如下的链接进行访问:

http://localhost:8082/resource/user

或者通过程序使用如下的 Ajax 方式获取数据:

$.get('./resource/user',{ts:new Date().getTime()},function(data)

6.5.3 查询登录用户的详细信息

在单独使用 Spring Security 安全管理的应用中,只要在控制器中使用 Principal,就能取得用户的完整信息,或者使用如代码清单 6-17 所示的代码,也能很容易地获取登录用户的详细信息。但是,使用 SSO 之后,这种方法就不能适用了,这时如果使用 getDetails()将返回一个空值,而在控制器中使用 Principal 也只能返回登录用户的用户名、用户拥有的角色和登录令牌等信息而已,用户的其他信息如性别、邮箱等将不能取得。这是 OAuth2 基于安全的考虑而设计的,因为 SSO 涉及了第三方的应用请求,所以它保护了登录用户的隐私信息。

代码清单 6-17 查看登录用户的详细信息

Authentication authentication = SecurityContextHolder.getContext().getAuthen
tication();
User user = (User)authentication.getDetails();

如果需要取得登录用户的详细信息,如性别、邮箱、所属的部门等,就只能像前面提到的那样,使用资源服务器提供的共享资源接口,然后通过 Zuul 路由代理服务获取已经登录的用户详细信息。

代码清单 6-18 是一个使用 Ajax 获取登录用户的详细信息的例子。

代码清单 6-18 从资源服务器中获取登录用户的详细信息

function getuserinfo(){
    $.get('./resource/user',{ts:new Date().getTime()},function(data){
        var $list = $('#tbodyContent').empty();
            var html = "" ;
            html += '<tr> ' +
                '<td>'+ (data.id==null?'':data.id) +'</td>' +
                '<td>'+ (data.name==null?'':data.name) +'</td>' +
                '<td>'+ (data.email==null?'':data.email) +'</td>' +
                '<td>'+ (data.department==null?'' :data.department) +'</td>' +
                '<td>'+ (data.createdate==null?'': getSmpFormatDateByLong(data.
createdate,true)) +'</td>';
            html +='</tr>' ;
            $list.append($(html));
    });
}

最后完成的用户信息查询的效果图如图 6-2 所示。

图 6-2 获取用户信息示例

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。