原创内容,转载请注明出处!
关于为什么要写这篇Blog:
因为工作需要,需要为公司开发一个产品后台系统,该系统需要管理我们公司所开发的各个应用的一些功能, 如数据分析,客户开通之类的,说白了就是这个后台系统是给我们公司内部人员用的, 然后这个后台系统主要就是调用其他应用的一些接口而已.
由于每个应用的接口都涉及到鉴权这方面的内容,所以后台系统并没有办法直接去调用它们, 后来想到我们可以单独开发一个OAuth2认证服务,为客户端(后台系统)授权token, 客户端携带token调用这些接口,调用接口前包一层验证token有效性的逻辑,验证通过后即可访问,这样就可以在不影响原因产品接口上的逻辑而实现第三方应用的接口调用鉴权.
公司中所有产品服务端都是使用Spring Security 做为安全框架的, 后来发现有Spring Security OAuth2 这个框架, 那当然是使用亲儿子最好了.
关于Spring Security OAuth2 (以下简称SSO):
网上关于它的介绍有很多, 我在这里就简单的说一下, SSO(Spring Security OAuth2) 是基于Spring Security 之上的一个为我们提供OAuth2实现的一个框架, 具体实现方式和Spring Security 差不多, 也是包含 Filter ,AuthenticationManager ,AuthenticationToken , UserDetails, UserDetailsService 这些核心的抽象的实现.
所以有一定的Spring Security 的基础学习SSO会方便很多.
关于OAuth2我就不做过多介绍了,网上有很多资料..
下面说一下SSO的一些核心概念,在理解完这些概念后再看代码才会知道当前正在做些什么, 我尽量用比较通俗易懂的语言来介绍这些概念,为了方便大家理解.
首先说一下OAuth2的提供端:
OAuth2需要提供什么? 当然是提供资源的保护,以及生成Token,验证Token这两块内容, 下面分来介绍一下.
AuthorizationServer (授权服务):
授权服务的作用就是用来管理access_token的包括生成,验证,校验等一些服务, 还包括配置客户端的一些信息, 以及授权,验证端点的一些配置内容, 具体配置下面会讲到.
ResourceServer(资源服务):
资源服务主要是来管理我们需要被保护的资源的一些配置, 还有一些token验证方式等..
上述两个核心服务,可以是同一个应用内的,也可以是分别不同的应用. 意思就是, 我的授权服务可能是单独一个应用, 它可以用来管理多个资源服务应用的令牌的生成, 资源服务一般会集成在我们本身的应用中对外提供资源.
说的比较简短,可能看完还是会云里雾里的, 没关系,接下来我会一步一步分析这两块内容, 首先理解一个大致的概念即可.
代码样例:
首先说一下测试应用的概观, 待会儿分别会配置两个应用, 一个是授权服务应用跑在8080端口, 一个是资源服务应用跑在8081端口.
我会用代码实现以下操作, 资源服务应用提供了两个资源, 一个未受保护, 一个受OAuth2保护, 我会首先在8080端口申请access_token 然后携带access_token访问8081端口的受保护资源.
首先来看一下项目的目录结构: