资讯专栏INFORMATION COLUMN

spring cloud admin开源项目ACE源码阅读-鉴权

buildupchao / 1354人阅读

摘要:鉴权项目是一个比较完整的使用了框架的开源项目,可以用它来快速搭建分布式系统。本次着重看的部分是其服务以及用户鉴权的部分。启动项目依次启动,,,即可。服务端则负责生成,验证和更新。服务认证由处理。的鉴权也是通过的。

鉴权

ACE项目是一个比较完整的使用了spring cloud框架的开源项目,可以用它来快速搭建分布式系统。本次着重看的部分是其服务以及用户鉴权的部分。ACE有一个鉴权服务,负责微服务群的鉴权。启动ACE项目依次启动center,auth-server,admin,gateway即可。

模块架构

鉴权模块分为服务端和客户端(另有一个common模块,可忽略,是一些鉴权模块公用代码的提取)。应用程序依赖客户端,客户端提供了两个拦截器,工具类,并和服务端通信的feign。服务端则负责token生成,验证和更新。

代码分析 程序启动

auth-server启动时初始化KeyConfiguration,获得userSecret和serviceSecret.并在启动结束的钩子类AuthServerRunner中,分别设置User和Server的pri/puk.User用于用户认证,Server用于微服务认证。

admin和gateway在启动的时候,会调用auth-client的自动配置,生成ServiceAuthConfig和UserAuthConfig的实例。同时auth-client的AuthClientRunner会请求pubkey到ServiceAuthConfig和UserAuthConfig的实例。同时在应用各自的WebConfiguration中添加UserAuthRestInterceptor和ServiceAuthRestInterceptor拦截器

运行阶段

用户认证,由UserAuthRestInterceptor处理。
在用户登录的时候,调用jwtTokenUtil.generateToken生成token。这个token的生成规则稍后再论。在浏览器记录一个Admin-Token.

--auth-server
public String login(JwtAuthenticationRequest authenticationRequest) throws Exception {
        UserInfo info = userService.validate(authenticationRequest);
        if (!StringUtils.isEmpty(info.getId())) {
            return jwtTokenUtil.generateToken(new JWTInfo(info.getUsername(), info.getId() + "", info.getName()));
        }
        throw new UserInvalidException("用户不存在或账户密码错误!");
}

登录之后的请求都会经过UserAuthRestInterceptor,在解析token的时候同时会进行过期,签名合法等验证。并把这些信息加到threadLocal中去。

--UserAuthRestInterceptor
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        ......
        IJWTInfo infoFromToken = userAuthUtil.getInfoFromToken(token);
        BaseContextHandler.setUsername(infoFromToken.getUniqueName());
        BaseContextHandler.setName(infoFromToken.getName());
        BaseContextHandler.setUserID(infoFromToken.getId());
        return super.preHandle(request, response, handler);
}
    
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        BaseContextHandler.remove();
        super.afterCompletion(request, response, handler, ex);
}

服务认证由ServiceAuthRestInterceptor处理。service的鉴权也是通过user的token。通过serviceAuthConfig.getTokenHeader()来解析service的信息。

--ServiceAuthRestInterceptor
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
       ......
        String token = request.getHeader(serviceAuthConfig.getTokenHeader());
        IJWTInfo infoFromToken = serviceAuthUtil.getInfoFromToken(token);
        String uniqueName = infoFromToken.getUniqueName();
        for(String client:serviceAuthUtil.getAllowedClient()){
            if(client.equals(uniqueName)){
                return super.preHandle(request, response, handler);
            }
        }
        throw new ClientForbiddenException("Client is Forbidden!");
}
一些方法解读(待补充)

jwtTokenUtil.generateToken:生成用户token
userService.validate:验证用户的合法性
userAuthUtil.getInfoFromToken(token):从token中获得用户名称和ID等信息。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/71736.html

相关文章

  • 分布式系统--感性认识JWT

    摘要:的安全性不好,攻击者可以通过获取本地进行欺骗或者利用进行攻击。 好久没写博客了,因为最近公司要求我学spring cloud ,早点将以前软件迁移到新的架构上。所以我那个拼命的学呐,总是图快,很多关键的笔记没有做好记录,现在又遗忘了很多关键的技术点,极其罪恶! 现在想一想,还是踏踏实实的走比较好。这不,今天我冒了个泡,来补一补前面我所学所忘的知识点。 想要解锁更多新姿势?请访问我的博客...

    sherlock221 评论0 收藏0
  • 架构~微服务

    摘要:接下来继续介绍三种架构模式,分别是查询分离模式微服务模式多级缓存模式。分布式应用程序可以基于实现诸如数据发布订阅负载均衡命名服务分布式协调通知集群管理选举分布式锁和分布式队列等功能。 SpringCloud 分布式配置 SpringCloud 分布式配置 史上最简单的 SpringCloud 教程 | 第九篇: 服务链路追踪 (Spring Cloud Sleuth) 史上最简单的 S...

    xinhaip 评论0 收藏0
  • Spring Security

    摘要:框架具有轻便,开源的优点,所以本译见构建用户管理微服务五使用令牌和来实现身份验证往期译见系列文章在账号分享中持续连载,敬请查看在往期译见系列的文章中,我们已经建立了业务逻辑数据访问层和前端控制器但是忽略了对身份进行验证。 重拾后端之Spring Boot(四):使用JWT和Spring Security保护REST API 重拾后端之Spring Boot(一):REST API的搭建...

    keelii 评论0 收藏0
  • Spring Web

    摘要:认证鉴权与权限控制在微服务架构中的设计与实现一引言本文系认证鉴权与权限控制在微服务架构中的设计与实现系列的第一篇,本系列预计四篇文章讲解微服务下的认证鉴权与权限控制的实现。 java 开源项目收集 平时收藏的 java 项目和工具 某小公司RESTful、共用接口、前后端分离、接口约定的实践 随着互联网高速发展,公司对项目开发周期不断缩短,我们面对各种需求,使用原有对接方式,各端已经很...

    Kosmos 评论0 收藏0
  • Spring Boot Admin 2.1.0 全攻略

    摘要:并向注册中心注册,注册地址为,最后将的所有端口暴露出来,配置如下在工程的启动类加上注解,开启的功能,加上注解开启的功能。在启动类加上注解,开启的功能。 转载请标明出处: https://www.fangzhipeng.com本文出自方志朋的博客 Spring Boot Admin简介 Spring Boot Admin是一个开源社区项目,用于管理和监控SpringBoot应用程序。 ...

    TalkingData 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<