
Spring-Security-OAuth2作用与原理解析OAuth2OAuth2作用OAuth2的四种角色OAuth2四种授权模式授权码模式密码模式简化模式客户端模式Spring-Security-OAuth2OAuth2OAuth2作用OAuth是一个关于授权的网络开放标准可以允许第三方应用访问用户存储在其他服务的资源而不需要用户提供账号和密码。比如京东接入微信开放平台通过微信登录其实就是允许京东访问用户存储在微信上的身份信息。首先第一步用户请求京东的登录页面京东返回登录页面浏览器展示京东的登录页面。第二步用户点击微信登录浏览器请求京东后台京东后台携带在微信开放平台注册的redirect_uri请求微信开放平台返回登录界面微信返回登录界面后前端展示的就是一个二维码。第三步用户扫码点击同意微信授权服务器接收到登录请求验证登录信息是否正确如果登录信息正确那么微信的授权服务器携带授权码回调京东的redirect_uri。第四步京东接收到回调后携带code、appid、appsecret请求微信获取access_token微信生成access_token并把它保存起来然后返回access_token。第五步京东后台收到access_token后携带access_token请求微信的资源服务器获取用户信息获取到用户信息后返回用户信息到前端。获取到用户信息后登录成功前端跳转到京东首页。OAuth2的四种角色四种角色分别是Resource Owner资源用户者也就是用户。Client客户端也就是第三方应用。Authorization server授权服务器服务提供商比如上面的微信专门用于进行认证授权的服务器。Resource server资源服务器存储用户生成并存放在服务提供商的资源。四者的关系如下图可见OAuth2的大体思路就是用户授权第三方应用授权服务器就会给第三方应用颁发token第三方应用拿到授权服务器颁发的token才可以访问资源服务器。OAuth2四种授权模式OAuth2规定了四种授权模式分别是授权码模式、密码模式、简化模式、客户端模式。首先不管使用哪种模式客户端第三方应用都需要到目标系统进行备案拿到客户端idclient id和客户端密钥client secret。授权码模式授权码模式是应用最广泛并且安全性也是最高的授权模式上面京东通过微信开放平台进行授权登录的例子就是授权码模式的例子。流程如下这里最后一步返回的除access_token以外还有一个refresh_token这个refresh_token的作用是在access_token失效以后可以通过refresh_token授权服务器直接颁发一个新的token无需再走一遍这个复杂的认证授权流程。密码模式这种模式适合高度可信任的应用比如公司自己的应用请求公司自己搭建的授权服务器进行认证授权那么就可以使用密码模式。用户直接向客户端提供用户名和密码客户端直接拿着用户提供的用户名和密码到授权服务器进行认证授权。这种模式要求客户端不能存储用户名和密码。流程如下简化模式这种模式适合没有后端的纯前端应用由于没有后端就无法使用授权码模式了。这种模式下只有用户同意授权授权服务器就直接颁发token并在重定向URI中携带该token引导浏览器进行重定向。流程如下客户端模式这种模式适合没有前端的命令行应用。由于没有前端就无法通过前端界面让用户选择是否授权了因此这种模式是客户端以自己的名义而不是用户请求授权服务器进行认证授权。Spring-Security-OAuth2Spring-Security-OAuth2整合了Spring-Security和OAuth2是OAuth2协议的一种实现底层基于Spring-Security做扩展。整体架构如下用户访问第三方应用第三方应用访问资源服务器获取资源比如用户信息但是此时没有token于是OAuth2RestTemplate会报错该报错信息被OAuth2ClientContextFilter捕获OAuth2ClientContextFilter引导浏览器重定向到授权服务器。授权服务器通过Authorization Endpoint授权端点进行授权Authorization Endpoint通过AuthorizationServerTokenServices生成授权码。客户端拿到授权码请求授权服务器通过Token Endpoint令牌端点生成token令牌Token Endpoint调用AuthorizationServerTokenServices生成token然后返回token给客户端。客户端获取到token携带token访问资源服务器请求获取资源资源服务器通过OAuth2AuthenticationManager调用ResourceServerTokenServices进行token验证验证通过则可以访问资源。Spring-Security-OAuth2的使用在Maven依赖方面可以引入spring‐boot‐starter‐security加spring‐security‐oauth2也可以直接引入spring‐cloud‐starter‐oauth2spring‐boot‐starter‐security spring‐security‐oauth2spring‐cloud‐starter‐oauth2Maven依赖引入后就是在配置类做各种配置比如spring security的配置授权服务器配置资源服务器配置等。其中授权服务器需要通过EnableAuthorizationServer注解声明开启而资源服务器需要通过EnableResourceServer注解声明开启。具体配置这里就不展开说了没有什么技术含量网上也一大推资料。