spring security oauth2(原生,非boot)
首先配置认证服务器,随便定义几个客户端
定义客户端接下来是tokenStore,我这里使用redis
tokenStore当然,在此之前,已经配置了好了spring security,这是前提,在这里只着重介绍下oauth2相关配置。
服务端搞定后就是客户端,完成一个,第二个再copy第一个就行了。由于客户端需要访问服务端,所以需要配置一个oauth2的restTemplate,而OAuth2RestTemplate需要一个OAuth2ProtectedResourceDetails以及OAuth2ClientContext,配置如下:
客户端配置这里使用的授权码模式(密码模式一跑起来就死循环,还没弄清原因),注意,上图中的OAuth2ClientContextFilter由@EnableOAuth2Client注解带来的,在springboot中,实现这些功能,一个@EnableOAuth2Sso就搞定了,感觉把所有一切都屏蔽了,个人不是很喜欢,目前springboot2好像将此注解去掉了。 接下来还要注册一个OAuth2ClientAuthenticationProcessingFilter,此过滤器就是专门处理某一个请求来获取token,这个请求默认为login
过滤器配置OAuth2ClientAuthenticationProcessingFilter注册后还要在configure方法中添加一下(上上张图中),当然,还需要一个和服务端一样的tokenStore。这时就差不多配置好了,将这个client的项目再拷一份,这样就有两个client。然后,依次启动server,client1,client2。访问client1时会被重定向到服务端进行登录:
登录后进入授权页面(如果不想要这一步,在认证服务器的client配置中添加autoApprove(true)即可):
授权后client1获取授权码,在OAuth2ClientAuthenticationProcessingFilter中会拿此授权码去server的tokenEndpoint请求token,获取后,通过token拿到Authentication,spring security上下文会被填充,完成认证,访问资源。这时再去请求client2的资源,被重定向到server后,由于server在当前浏览器已完成认证,session中可以拿到Authentication,于是,直接获取授权码,然后拿到token,不需要再重复登录,直接访问到资源了!!!