学成在线-第16天-讲义- Spring Security Oauth2 JWT三

2.3 Spring security Oauth2认证解决方案
本项目采用 Spring security + Oauth2完成用户认证及用户受权,Spring security 是一个强大的和高度可定制的身份验证和访问控制框架,Spring security 框架集成了Oauth2协议,下图是项目认证架构图: 

 
1、用户请求认证服务完成认证。 
2、认证服务下发用户身份令牌,拥有身份令牌表示身份合法。 
3、用户携带令牌请求资源服务,请求资源服务必先通过网关。 
4、网关校验用户身份令牌的合法,不合法表示用户没有登陆,若是合法则放行继续访问。 
5、资源服务获取令牌,根据令牌完成受权。 
6、资源服务完成受权则响应资源信息。
3 Spring Security Oauth2研究
3.1 目标 
本项目认证服务基于Spring Security Oauth2进行构建,并在其基础上做了一些扩展,采用JWT令牌机制,并自定义了用户身份信息的内容。 本教程的主要目标是学习在项目中集成Spring Security Oauth2的方法和流程,经过
spring Security Oauth2的研究须要达到如下目标: 
1、理解Oauth2的受权码认证流程及密码认证的流程。 
2、理解spring Security Oauth2的工做流程。 
3、掌握资源服务集成spring Security框架完成Oauth2认证的流程。 
3.2 搭建认证服务器

3.2.1导入基础工程 
导入资料目录下的 xc-service-ucenter-auth工程,该工程是基于Spring Security Oauth2的一个二次封装的工程,导入此工程研究Oauth2认证流程。
3.2.2 建立数据库 
导入资料目录下的 xc_user.sql,建立用户数据库

 
“oauth_”开头的表都是spring Security 自带的表。 
本项目中spring Security 主要使用oauth_client_details表:
 

client_id:客户端id 
resource_ids:资源id(暂时不用) 
client_secret:客户端密码 
scope:范围 
access_token_validity:访问token的有效期(秒) 
refresh_token_validity:刷新token的有效期(秒) 
authorized_grant_type:受权类型,authorization_code,password,refresh_token,client_credentials

3.3 Oauth2受权码模式 
3.3.1 Oauth2受权模式 
Oauth2有如下受权模式: 
受权码模式(Authorization Code) 隐式受权模式(Implicit) 密码模式(Resource Owner PasswordCredentials) 客户端模式(Client Credentials
其中受权码模式和密码模式应用较多,本小节介绍受权码模式。 
3.3.2 受权码受权流程 
上边例举的黑马程序员网站使用微信认证的过程就是受权码模式,流程以下: 
1、客户端请求第三方受权 
2、用户(资源拥有者)赞成给客户端受权 
3、客户端获取到受权码,请求认证服务器申请 
令牌 4、认证服务器向客户端响应令牌 
5、客户端请求资源服务器的资源,资源服务校验令牌合法性,完成受权 
6、资源服务器返回受保护资源 
3.3.2 申请受权码 
请求认证服务获取受权码: 
Get请求: 程序员

localhost:40400/auth/oauth/authorize?
client_id=XcWebApp&response_type=code&scop=app&redirect_uri=http://localhost

参数列表以下: 
client_id:客户端id,和受权配置类中设置的客户端id一致。 
response_type:受权码模式固定为code 
scop:客户端范围,和受权配置类中设置的scop一致。 
redirect_uri:跳转uri,当受权码申请成功后会跳转到此地址,并在后边带上code参数(受权码)。 
首先跳转到登陆页面:
 

输入帐号和密码,点击Login。 
Spring Security接收到请求会调用UserDetailsService接口的loadUserByUsername方法查询用户正确的密码。 
当前导入的基础工程中将正确的密码硬编码为“123”,因此这里帐号随意输入,密码输入123便可认证经过。 
接下来进入受权页面:
 

 spring