- 前言
- 第一部分 基础应用开发
- 第 1 章 Spring Boot 入门
- 第 2 章 在 Spring Boot 中使用数据库
- 第 3 章 Spring Boot 界面设计
- 第 4 章 提高数据库访问性能
- 第 5 章 Spring Boot 安全设计
- 第二部分 分布式应用开发
- 第 6 章 Spring Boot SSO
- 第 7 章 使用分布式文件系统
- 第 8 章 云应用开发
- 第 9 章 构建高性能的服务平台
- 第三部分 核心技术源代码分析
- 第 10 章 Spring Boot 自动配置实现原理
- 第 11 章 Spring Boot 数据访问实现原理
- 第 12 章 微服务核心技术实现原理
- 附录 A 安装 Neo4j
- 附录 B 安装 MongoDB
- 附录 C 安装 Redis
- 附录 D 安装 RabbitMQ
- 结束语
6.5 共享资源服务
实例工程的共享资源模块,可以为已经授权的用户提供一些共享信息服务。代码清单 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 获取用户信息示例
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论