本文所介绍的项目是一个基于oath2协议的应用,实现的的功能逻辑与QQ互联,微博开放平台相似,都是同一套认证受权流程。java
项目结构简单易懂,却不偷工减料,在学习完本文内容后,读者能够直接获取文中的项目代码用于学习或者copy到公司的生产项目中修改后使用,真正达到学以至用的目的。git
所涉及技术栈:github
本项目包括功能有web
- 用户注册自动分配角色权限
- 用户只能访问本身所拥有的角色权限访问路径
- 用户能够申请获取客户ID和客户密钥
- 用户能够经过客户ID获取受权码
- 用户能够经过客户ID和密钥以及受权码获取access token 和referrsh token和scope
- 可自定义配置需受权url
- 可自定义配置受限url的访问scope
- 未受权用户或访问权限不足用户,页面提示相信息
- 用户经过access token 来访问对应url
首先来看一下项目的结构图,了解项目的大体布局spring
接下来正式介绍关于项目的细节,因为项目自己就已经有很多中文注释,因此在讲解的时候会收缩起一些代码的具体实现,若是读者不习惯能够在这里点在线比对阅读或者fork到本身的项目里阅读==> 项目代码sql
@EnableWebSecurity
打开了 HttpSecurity 的安全配置,则该类将生效用户注册则往用户表插入数据,同时往用户角色表也插入一份数据。
固然也能够设计的更复杂些,好比根据来源、时间、白名单、内部推荐等设置不一样的权限,读者可自行扩展。 docker
首先来看一下表结构,oauth_client_details 为spring cloud oath2自带的表, user_client_secret 为咱们本身建立的表 数据库
具体的实如今spring-security-oauth包中的, 非本项目内的自我实现api
客户ID获取受权码 请求url: http://localhost:8080/oauth/authorize?response_type=code&client_id=client_92&redirect_uri=http://localhost:8080/code安全
具体的实如今spring-security-oauth包中的 org.springframework.security.oauth2.provider.endpoint.TokenEndpoint
类,有兴趣的同窗能够在里面进行debug调试
用受权码获取access_token 请求url: http://localhost:8080/oauth/token?grant_type=authorization_code&code=8fGtOV&client_id=client_92&client_secret=123456&redirect_uri=http://localhost:8080/code&scope=all
# 出现以下相似错误标识code失效,从新在获取受权码操做便可
{
"error": "invalid_grant",
"error_description": "Invalid authorization code: iq30f9"
}
复制代码
刷新 accessToken的 请求url: http://localhost:8080/oauth/token?grant_type=refresh_token&refresh_token=4741d043-e202-4de0-ae21-4f5c7ec5626e&client_id=client_1&client_secret=123456
验证accessToken的 请求url: http://localhost:8080/oauth/check_token?token=1131809b-ee12-4aea-9823-ea4454b96f2d
到了这里,咱们来看另外一个项目 order-service, 其实取名叫 order-api-resource 比较合适,不过也懒得改了。这个项目的结构与代码比较稀少,因此学习起来更为轻松。
antMatchers()
和
authenticated()
方法来配置,查看图中红框内的内容, 这些都是表明须要拦截验证的请求路径url,除了拦截请求外,还能够指定拦截请求方式,好比访问
/api/trade/ ,只对 POST 访问作拦截, GET 请求的访问一概放行。
access()
方法指定访问的该 url 须要的 scope,取值为 oauth_client_details 表中的 scope 值, 若是scope值与代码中定义的不一致,则会出现以下错误:
spring-security-oauth2-2.2.1.RELEASE-sources.jar 中的 RemoteTokenServices.java 用于远程调用 token 服务(开发平台)进行操做