用户认证与授权:
用户身份认证:用户去访问系统资源时系统要求验证用户的身份信息,身份合法方可继续访问。常见的用户身份认证表现形式有:用户名密码登录,指纹打卡等方式。
用户授权:用户认证通过后去访问系统的资源,系统会判断用户是否拥有访问资源的权限,只允许访问有权限的系统资源,没有权限的资源将无法访问,这个过程叫用户授权。
单点登录(Single Sign On):本项目包括多个子项目,为了提高用户体验性需要实现用户只认证一次便可以在多个拥有访问权限的系统中访问,这个功能叫做单点登录。
第三方认证:
当需要访问第三方系统资源时需要首先通过第三方系统的认证(例如:微信认证),由第三方系统对用户认证通过,并授权资源的访问权限。
微信扫码登录:微信不属于本系统,本系统并没有存储微信用户的账号、密码等信息,本系统如果要获取该用户的基本信息则需要首先通过微信的认证系统(微信认证)进行认证,微信认证通过后本系统便可获取该微信用户的基本信息,从而在本系统将该微信用户的头像、昵称等信息显示出来,该用户便不用在本系统注册即可直接学习。
单点登录的特点:
1、认证系统为独立的系统
2、各子系统通过Http或其它协议与认证系统通信,完成用户认证
3、用户身份信息存储在Redis集群
Oauth2认证:
第三方认证技术方案最主要是解决认证协议的通用标准问题,因为要实现跨系统认证,各系统之间要遵循一定的接口协议。
OAUTH协议为用户资源的授权提供了一个安全、开放而又简易的标准。同时任何第三方都可以使用OAUTH认证服务,任何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的,OAUTH标准逐渐成为开放资源授权的标准。
微信认证流程:
1、用户点击微信登录
2、页面由后端生成微信二维码
3、用户扫描二维码授权登录
4、微信后台接收到授权码然后认证
5、后台接收到微信回调函数返回的用户信息
6、验证该用户如果第一次登陆存储该用户信息,如果不是第一次登陆请求认证服务器给予权限
7、后台处理用户信息将信息展示到页面
后端工程搭建
1、创建xc-service-ucenter-auth工程
pom中导入:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-oauth2</artifactId> </dependency>
2、创建xc_user表
以“oauth_”开头的表都是spring Security 自带的表。
本项目中spring Security 主要使用oauth_client_details表:
Oauth2授权模式:
授权码模式(Authorization Code) 、隐式授权模式(Implicit) 、密码模式(Resource Owner Password Credentials) 、客户端模式(Client Credentials)
其中授权码模式和密码模式应用较多,本小节介绍授权码模式
3、授权码授权流程
1、客户端请求第三方授权
2、用户(资源拥有者)同意给客户端授权
3、客户端获取到授权码,请求认证服务器申请令牌
4、认证服务器向客户端响应令牌
5、客户端请求资源服务器的资源,资源服务校验令牌合法性,完成授权
6、资源服务器返回受保护资源
启动工程,浏览器输入如下地址,请求认证服务获取授权码:
localhost:40400/auth/oauth/authorize? client_id=XcWebApp&response_type=code&scop=app&redirect_uri=http://localhost
参数列表如下:
client_id:客户端id,和授权配置类oauth_client_details中设置的客户端id一致
response_type:授权码模式固定为code,密码模式为password
scop:客户端范围,和授权配置类中设置的scop一致
redirect_uri:跳转uri,当授权码申请成功后会跳转到此地址,并在后边带上code参数(授权码)
首页跳转到如下页面:
输入用户名和密码后跳转http://localhost路径,网址最右侧的code即为授权码。
用户名和密码都是:XcWebApp
点击Authorize授权登录后跳转到首页:
拿到授权码:JyJ40q接着申请令牌
申请令牌
利用postman请求:
Post请求:http://localhost:40400/auth/oauth/token
此链接需要使用 http Basic认证。
响应数据:
access_token:访问令牌
token_type:令牌类型
refresh_token:刷新令牌
expires_in:令牌过期时间
scope:作用范围
jti:通常存储到session中
资源服务授权配置
资源服务拥有要访问的受保护资源,客户端携带令牌访问资源服务,如果令牌合法则可成功访问资源服务中的资源,如下图:
1、配置公钥
启动course工程,输入如下内容:http://localhost:31200/course/coursepic/list/297e7c7c62b888f00162b8a7dec20000无法访问,如下图所示:
需要放行后才能访问,下面有解决方法。
正常显示:
认证服务生成令牌采用非对称加密算法,认证服务采用私钥加密生成令牌,对外向资源服务提供公钥,资源服务使用公钥来校验令牌的合法性。
微 服 务 接 入 认 证 , 需 要 如 下 操 作 : \color{#FF0000}{微服务接入认证,需要如下操作:}微服务接入认证,需要如下操作:
将公钥拷贝到 publickey.txt文件中,将此文件拷贝到课程服务工程的resource下
2、pom中添加依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-oauth2</artifactId> </dependency>
3、在config包下创建ResourceServerConfig类
4、测试课程图片携带令牌查询
get:http://localhost:31200/course/coursepic/list/297e7c7c62b888f00162b8a7dec20000
请求时没有携带令牌则报错,如上图
请求时携带令牌:
在http header中添加 Authorization: Bearer+空格+令牌
当输入错误的令牌也无法正常访问资源。
当课程管理加了授权之后再访问swagger-ui则报错:
针对swagger-ui的请求路径进行放行,修改授权配置类ResourceServerConfig的configure方法:
//Http安全配置,对每个到达系统的http请求链接进行校验 @Override public void configure(HttpSecurity http) throws Exception { //所有请求必须认证通过 http.authorizeRequests() //下边的路径放行 .antMatchers("/v2/api-docs", "/swagger-resources/configuration/ui", "/swagger-resources","/swagger-resources/configuration/security", "/swagger-ui.html","/webjars/**","/course/coursepic/list/**").permitAll() .anyRequest().authenticated(); }
注意: 通过上边的配置虽然可以访问swagger-ui,但是无法进行接口调用,除非去掉认证的配置或在上边配置中添加所有请求均放行("/**")。
此时可以访问:
Oauth2密码模式授权
Post请求:http://localhost:40400/auth/oauth/token
参数: grant_type:密码模式授权填写password
username:itcast
password:123
并且此链接需要使用 http Basic认证
该 接 口 请 求 首 先 调 用 U s e r D e t a i l s S e r v i c e I m p l 类 中 的 l o a d U s e r B y U s e r n a m e 方 法 。 \color{#FF0000}{该接口请求首先调用UserDetailsServiceImpl类中的loadUserByUsername方法。}该接口请求首先调用UserDetailsServiceImpl类中的loadUserByUsername方法。
请求后结果:
将access_token字段粘贴到Authorization一栏,请求结果:
微 服 务 之 间 的 认 证 用 密 码 模 式 , 微 信 三 方 登 录 用 授 权 码 模 式 \color{#FF0000}{微服务之间的认证用密码模式,微信三方登录用授权码模式}微服务之间的认证用密码模式,微信三方登录用授权码模式