栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > 架构设计

分布式系统认证方案

架构设计 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

分布式系统认证方案

五、分布式系统认证方案 5.1 什么是分布式系统

随着软件环境和需求的变化,软件的架构由单体结构演变为分布式架构,具有分布式架构的系统叫分布式系统,分 布式系统的运行通常依赖网络,它将单体结构的系统分为若干服务,服务之间通过网络交互来完成用户的业务处 理,当前流行的微服务架构就是分布式系统架构。

分布式系统具体如下基本特点:
1、 分布性:每个部分都可以独立部署,服务之间交互通过网络进行通信,比如:订单服务、商品服务。
2、 伸缩性:每个部分都可以集群方式部署,并可针对部分结点进行硬件及软件扩容,具有一定的伸缩能力。
3、 共享性:每个部分都可以作为共享资源对夕龍供服务,多个部分可能有操作共享资源的情况。
4、 开放性:每个部分根据需求都可以对夕卜发布共享资源的访问接口 ,并可允许第三方系统访问。

5.2 分布式认证需求

分布式系统的每个服务都会有认证、授权的需求,如果每个服务都实现一套认证授权逻辑会非常冗余,考虑分布式 系统共享性的特点,需要由独立的认证服务处理系统认证授权的请求;考虑分布式系统开放性的特点,不仅对系统 内部服务提供认证,对第三方系统也要提供认证。分布式认证的需求总结如下:
统一认证授权
提供独立的认证服务,统一处理认证授权。
无论是不同类型的用户,还是不同种类的客户端(web端,H5、APP),均采用一致的认证、权限、会话机制,实现 统一认证授权。
要实现统一则认证方式必须可扩展,支持各种认证需求,比如:用户名密码认证、短信验证码、二维码、人脸识SU 等认证方式,并可以非常灵活的切换。
应用接入认证 应提供扩展和开放能力,提供安全的系统对接机制,并可开放部分API给接入第三方使用,一方应用(内部系统服 务)和三方应用(第三方应用)均采用统一机制接入。
5.3分布式认证方案
5.3.1选型分析
1、基于session的认证方式
在分布式的环境下,基于session的认证会出现一个问题,每个应用服务都需要在session中存储用户身份信息,通 过负载均衡将本地的请求分配到另一个应用服务需要将session信息带过去,否则会重新认证。

这个时候,通常的做法有下面几种:
Session复制:多台应用服务器之间同步session ,使session保持一致,对外透明。
Session黏贴:当用户访问集群中某台服务器后,强制指定后续所有请求均落到此机器上。
Session集中存储:将Session存入分布式缓存中,所有服务器应用实例统一从分布式缓存中存取Session。
总体来讲,基于session认证的认证方式,可以更好的在服务端对会话进行控制,且安全性较高。但是,session机 制方式基于cookie ,在复杂多样的移动客户端上不能有效的使用,并且无法跨域,另夕卜随着系统的扩展需提高 session的复制、黏贴及存储的容错性。
2、基于token的认证方式
基于token的认证方式,服务端不用存储认证数据,易维护扩展性强,客户端可以把token存在任意地方,并且可 以实现web和app统一认证机制。其缺点也很明显,token由于自包含信息,因此一般数据量较大,而且每次请求 都需要传递,因此比较占带宽。另夕卜,token的签名验签操作也会给cpu带来额夕卜的处理负担。

5.3.2技术方案
根据选型的分析,决定采用基于token的认证方式,它的优点是:
1、 适合统一认证的机制,客户端、一方应用、三方应用都遵循一致的认证机制。
2、 token认证方式对第三方应用接入更适合,因为它更开放,可使用当前有流行的开放协议Oauth2.0、等。
3、 一般情况服务端无需存储会话信息,减轻了服务端的压力。
分布式系统认证技术方案见下图:
接入方

WEB
移动端
第三方
接入
5.携帝切ken访冋资源
4.返回 access_t° 値 n
7•附加解析后明文token,转发讷遊到服务

资源
6.按验token,验证接入客户端权銀
L接入方讷求授权服务认证
8.解析井號证用户权限.若逐过则执行业务逻辑|
认证
俱验证登录用户京接入客户端
微服务■
〔资源}
微服务2
隨源}
微服务3
■源}
微服务n
隨源}

流聞述:
(1 )用户通过接入方(应用)登录,接入方采取OAuth2.0方式在统一认证服务(UAA)中认证。
(2 )认证服务(UAA)调用验证该用户的身份是否合法,并获取用户权限信息。
(3 )认证服务(UAA)获取接入方权限信息,并验证接入方是否合法。
(4 )若登录用户以及接入方都合法,认证服务生成jwt令牌返回给接入方,其中jwt中包含了用户权限及接入方权 限。
(5 )后续,接入方携带jwt令牌对API网关内的微服务资源进行访问。
(6 ) API网关对令牌解析、并验证接入方的权限是否能够访问本次请求的微服务。
(7)如果接入方的权限没问题,API网关将原请求header中附加解析后的明文Token ,并将请求转发至糊艮务。
(8 )糊艮务收到请求,明文token中包含登录用户的身份和权限信息。因此后续微服务自己可以干两件事:1 ,用 户授权拦截(看当前用户是否有权访问该资源)2 ,将用户信息存储进当前线程上下文(有利于后续业务逻辑随时 获取当前用户信息)
流程所涉及到UAA服务、API网关这三个组件职责如下:
1 )统一认证服务(UAA)
它承载了OAuth2.0接入方认证、登入用户的认证、授权以及生成令牌的职责,完成实际的用户认证、授权功能。
2) API网关
作为系统的唯一入口 , API网关为接入方提供定制的API集合,它可能还具有其它职责,如身份验证、监控、负载均 衡、缓存等。API网关方式的核心要点是,所有的接入方和消费端都通过统一的网关接入微服务,在网关层处理所 有的非业务功能。

六、Oauth 2.0

OAuth2.0
6.1 OAuth2.0 介绍
OAuth (开放授权)是一个开放标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不 需要将用户名和密码提供给第三方应用或分享他们数据的所有内容。OAuth2.0是OAuth协议的延续版本,但不向 后兼容OAuth 1.0即完全废止了OAuth 1.0。很多大公司如Google , Yahoo , Microsoft等都提供了OAUTH认证^ 务,这些都足以说明OAUTH标准逐渐成为开放资源授权的标准。
Oauth协议目前发展到2.0版本,1.0版本过于复杂,2.0版本已得到广泛应用。
参考:httDS:〃baike.baidu.com/item/oAuth/7153134?fr=aladdin
Oauth协议:httDS://tools.ietf.org/html/rfc6749
下边分析一个Oauth2认证的例子,通过例子去理解OAuth2.0协议的认证流程,本例子是黑马程序员网站使用微信 认证的过程,这个过程的简要描述如下:

用户借助微信认证登录黑马程序员网站,用户就不用单独在黑马程序员注册用户,怎么样算认证成功吗?黑马程序 员网站需要成功从微信获取用户的身份信息则认为用户认证成功,那如何从微信获取用户的身份信息?用户信息的 拥有者是用户本人,微信需要经过用户的同意方可为黑马程序员网站生成令牌,黑马程序员网站拿此令牌方可从微 信获取用户的信息。
1、客户端请求第三方授权
用户进入黑马程序的登录页面,点击微信的图标以微信账号登录系统,用户是自己在微信里信息的资源拥有者。
傍)黑马程序员、
VI www.itheima.com

点击"微信"出现一个二维码,此时用户扫描二维码,开始给黑马程序员授权。

瞬扫描
”黑马程序员用户中,CT
2、资源拥有者同意给客户端授权
资源拥有者扫描二维码表示资源拥有者同意给客户端授权,微信会对资源拥有者的身份进行验证,验证通过后,微 信会询问用户是否给授权黑马程序员访问自己的微信数据,用户点击"确认登录"表示同意授权,微信认证服务器会 颁发一个授权码,并重定向到黑马程序员的网站。
0
黑马程序貝
黑马程序员用户中心
即将登录黑马程序员用户中心,请确 认是本人操作
•使用你的帐号登录该应用
确认登录
取消
3、 客户端获取到授权码,请求认证服务器申请令牌
此过程用户看不到,客户端应用程序请求认证服务器,请求携带授权码。
4、 认证服务器向客户端响应令牌
微信认证服务器验证了客户端请求的授权码,如果合法则给客户端颁发令牌,令牌是客户端访问资源的通行证。
此交互过程用户看不到,当客户端拿到令牌后,用户在黑马程序员看到已经登录成功。
5、 客户端请求资源服务器的资源
客户端携带令牌访问资源服务器的资源。
黑马程序员网站携带令牌请求访问微信服务器获取用户的基本信息。
6、 资源服务器返回受保护资源
资源服务器校验令牌的合法性,如果合法则向用户响应资源信息内容。
以上认证授权详细的执行流程如下:

I一一 (E.J Access Token > |
I <- (F) Prot.ert.ed Resource |
+ +
OAauth2.0包括以下角色:
1、 客户端
本身不存储资源,需要通过资源拥有者的授权去请求资源服务器的资源,比如:Android客户端、Web客户端(浏 览器端)、微信客户端等。
2、 资源拥有者
通常为用户,也可以是应用程序,即该资源的拥有者。
3、 授权服务器(也称认证服务器)

用于服务提供商对资源拥有的身份进行认证、对访问资源进行授权,认证成功后会给客户端发放令牌
(access_token ),作为客户端访问资源服务器的凭据。本例为微信的认证服务器。
4、资源服务器
存储资源的服务器,本例子为微信存储的用户信息。
现在还有一个问题,服务提供商能允许随便一个客户端就接入到它的授权服务器吗?答案是否定的,服务提供商会 给准入的接入方一个身份,用于接入时的凭据:
clientjd :客户端标识client_secret :客户端秘钥
因此,准确来说,授权服务器对两种OAuth2.0中的两个角色进行认证授权,分别是资源拥有者、客户端。
6.2 Spring Cloud Security OAuth2
6.2.1环境介绍
Spring-Security-OAuth2是对OAuth2的一种实现,并且跟我们之前学习的Spring Security相辅相成,与Spring Cloud体系的集成也非常便利,接下来,我们需要对它进行学习,最终使用它来实现我们设计的分布式认证授权解 决方案。
OAuth2.0的服务提供方涵盖两个服务,即授权服务(Authorization Server,也叫认证服务)和资源服务(Resource Server),使用Spring Security OAuth2的时候你可以选择把它们在同一个应用程序中实现,也可以选择建立使用 同一个授权服务的多个资源服务。
授权服务(Authorization Server)应包含对接入端以及登入用户的合法性进行验证并颁发to ken等功能,对令牌 的请求端点由Spring MVC控制器进行实现,下面是配置一个认证服务必须要实现的endpoints :
・AuthorizationEndpoint 服务于认证请求。默认 URL : /oauth/authorize 0
, TokenEndpoint服务于访问令牌的请求。默认URL: /oauth/token o
资源服务(Resource Server),应包含对资源的保护功能,对非法请求进行拦截,对请求中token进行解析鉴 权等,下面的过滤器用于实现OAuth 2.0资源^务:
•OAuth2AuthenticationProcessingFilter用来对请求给出的身份令牌解析鉴权。
本教程分别创建uaa授权务(也可叫认证务)和orders单资源服务。

认证流程如下:
1、客户端请求UAA授权服鼬行认证。
2、认证通过后由UAA颁发令牌。
3、客户端携带令牌Token请求资源服务。

传智播客旗下 高端IT教育品牌
4、资源服务校验令牌的合法性,合法即返回资源信息。
6.2.2环境搭建
6.2.2.1父工程
创建maven工,呈作为父工程,依赖如下:


4.0.0
com.itheima.security
distributed-security
1.0-SNAPSHOT
pom

org.springframework.boot
spring-boot-starter-parent
2.1.3.RELEASE


UTF-8
UTF-8 1.8




org.springframework.cloud
spring-cloud-dependencies
Greenwich , RELEASE
pom
import


javax.servlet
javax.servlet-api
3.1.0
provided


javax.interceptor
javax.interceptor-api
1.2


com.alibaba
fastjson
1.2.47


org.projectlombok
lombok
1.18.0


mysql
mysql-connector-java
5.1.47


org.springframework.security
spring-security-jwt
1.0.10.RELEASE


org.springframework.security.oauth.boot
spring-security-oauth2-autoconfigure
2.1.3.RELEASE




${project.name}
src/main/resources true


@Override
public void configure(AuthorizationServerSecurityConfigurer security)!
security
.tokenKeyAccess(“permitAll()”)
.checkTokenAccess(“permitAll()”)
.allowFormAuthenticationForClientsO//允许表单认证
6.4.3测试
1、 测试申请令牌
使用密码模式申请令牌,客户端信息需要和数据库中的信息一致。
2、 测试授权码模式
生成的授权存储到数据库中 七、Spring Security实现分布式认证授权

7.1需求分析
回厕 支术方案如下:

1、 UAA认证服务负责认证授权。
2、 所有请求经过网关到达微服务
3、 网关负责鉴权客户端以及请求转发
4、 网关将token解析后传给微服务,微服务进行授权。
7.2.注册中心
所有微3艮务的请求都经过网关,网关从注册中心读取微务的地址,将请求转发至微务。
本节完成注册中心的搭建,注册中心采用Eureka。
1、创建maven工程
d.i s ti ibut ed^secuxi ty* di s c ovex y
B distributed_security-discovery. iml /TJ pom. xml
V src

java
com
itheima
security
distributed

f=resouxces
application, yml
test
2、pom.xm依赖如下



distributed-security
com.itheima.security
1.0-SNAPSHOT

4.0.0
distributed-security-discovery


org.springframework.cloud
spring-cloud-starter-netflix-eureka-server


org.springframework.boot
spring-boot-starter-actuator


〈/project〉
3、配置文件
在 resource s 中酉己置 application.yml
spring:
application:
name: distributed-discovery
server:
port: 53000 #启动端口
eureka:
server:
enable-self-preservation: false #关闭服务器自我保护,客户端心跳检测15分与中内错误达到80%服务会保
护,导掰IJ人还认为是好用的服务
eviction-interval-timer-in-ms: 10000 #清理间隔(单位毫秒,默认是) 5秒将客户端剔除的服务在服 务注册列表中剔除#
shouldllseReadOnlyResponseCache: true #eureka是CAP理论种基于AP策略,为了保证强—致性关闭此切换CP 默认不关闭false关闭
client:
register-with-eureka: false 不作为一个客户端注册到注册中心
fetch-registry: false 日寸,可以启动,彳旦扌艮异常:Cannot execute request on any known
server
instance-info-replication-interval-seconds: 10
serviceUrl:
defaultzone: http://localhost:$(server.port}/eureka/
instance:
hostname: $(spring.cloud.client,ip-address}
prefer-ip-address: true
instance-id: s p r i n g . a p p l i c a t i o n ・ n a m e : {spring.application・name}: spring.application・name:{spring.cloud.client・ip-
address): ( s p r i n g . a p p l i c a t i o n , i n s t a n c e i d : (spring.application , instance_id: (spring.application,instancei​d:(server.port}}
启动类:
package com.itheima.security.distributed.discovery;
import org.springframework.boot.SpringApplication;
import org. springframework. boot. autoconfigure. SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class DiscoveryServer {
public static void main(String[] args) {
SpringApplication.run(DiscoveryServer.class^ args);
7.3.网关
网关整合OAuth2.0有两种思路,一种是认证服务器生成jwt令牌,所有请求统一在网关层验证,判断权限等操作; 另一种是由各资源服务处理,网关只做请求转发。
我们选用第一种。我们把API网关作为OAuth2.0的资源服务器角色,实现接入客户端权限拦截、令牌解析并转发当 前登录用户信息(js。nToken)给微服务,这样下游微服务就不需要关心令牌格式解析以及OAuth2.0相关机制了。
API网关在认证授权体系里主要负责两件事:
(1 ) {^OAuth2.0的资源服务器角色,实现接入方权限拦截。
(2 )令牌解析并转发当前登录用户信息(明文token )给糊艮务
微服务拿到明文token(明文token中包含登录用户的身份和权限信息)后也需要做两件事:
(1 )用户授权拦截(看当前用户是否有权访问该资源)
(2)将用户信息存储进当前线程上下文(有利于后续业务逻辑随时获取当前用户信息)
7.3.1创建工程
distxibuted^secuxity-gateway
B distributed-security-gateway, iml
/TJ pom. xml
V src
V main
v java
v Q com
v E itheima
v security
v distributed
v gateway

TH common
v 町 config
C Re s ouc e S erverC onf i g
C TokenConfig
C WebSecurityConfig
C ZuulConfig
El dto
El filter
翎 Gat ewayS er ver
V resources
application, properties
1、pom.xml



distributed-security
com.itheima.security
1.0-SNAPSHOT

4.0.0
distributed-security-gateway


org.springframework.cloud
spring-cloud-starter-netflix-eureka-client


org.springframework.cloud spring-cloud-starter-netflix-hystrix


org.springframework.cloud
spring-cloud-starter-netflix-ribbon


org.springframework.cloud
spring-cloud-starter-openfeign


com.netflix.hystrix
hystrix-javanica


org.springframework.retry
spring-retry


org.springframework.boot
spring-boot-starter-actuator


org.springframework.boot spring-boot-starter-web


org.springframework.cloud
spring-cloud-starter-netflix-zuul


org.springframework.cloud spring-cloud-starter-security


org.springframework.cloud spring-cloud-starter-oauth2


org.springframework.security
spring-security-jwt

javax.interceptor javax.interceptor-api com.alibaba fastjson org.projectlombok lombok 2、配置文件 酉 Ma pplication.properties spring.application.name=gateway-server server.port=53010 spring.main.allow-bean-definition-overriding = true logging.level.root = info logging.level.org.springframework = info zuul.retryable = true zuul.ignoredServices = * zuul.add-host-header = true zuul.sensitiveHeaders = * zuul.routes.uaa-service.stripPrefix = false zuul.routes.uaa-service.path = /uaa @Configuration @EnableResourceServer public class UAAServerConfig extends ResourceServerConfigurerAdapter { @Autowired private TokenStore tokenstore; @Override public void configure(ResourceServerSecurityConfigurer resources)! resources.tokenStore(tokenStore).resourceId(RESOURCE_ID) .stateless(true); } @Override public void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/uaa @Configuration @EnableResourceServer public class OrderServerConfig extends ResourceServerConfigurerAdapter { @Autowired private TokenStore tokenstore; @Override public void configure(ResourceServerSecurityConfigurer resources) { resources.tokenStore(tokenStore).resourceId(RESOURCE_ID) .stateless(true); } @Override public void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/order public class AuthFilter extends ZuulFilter { @Override public boolean shouldFilter() { return true; } @Override public String filterType() { return "pre"; } @Override public int filterOrder() { return 0; } @Override public Object run() { Requestcontext ctx = Requestcontext.getCurrentContext(); Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (! (authentication instanceof 0Auth2Authentication)){ // 无token访问网关内资源的情况,目 前仅有uu a服务直接暴露 return null; } 0Auth2Authentication oauth2Authentication = (0Auth2Authentication)authentication; Authentication userAuthentication = oauth2Authentication.getUserAuthentication(); Object principal = userAuthentication.getPrincipal(); List authorities = new ArrayList(); userAuthentication.getAuthorities().stream().forEach(s - >authorities.add(((GrantedAuthority) s).getAuthority())); 0Auth2Request oAuth2Request 二 oauth2Authentication.getOAuth2Request(); Map

传智播客旗下 高端IT教育品牌
(2 )将filter纳入spring 容器:
配置 Auth Filter
package com.itheima.security.distributed.gateway.config;
import com.itheima.security.distributed.gateway.filter.AuthFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationsource; import org.springframework.web.filter.CorsFilter;
^Configuration public class ZuulConfig {
@Bean
public AuthFilter preFileter() { return new AuthFilter();
}
@Bean
public FilterRegistrationBean corsFilter() {
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); final CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("");
config.addAllowedHeader("");
config.addAllowedMethod("*");
config.setMaxAge(18000L);
source.registerCorsConfiguration('7**“config);
CorsFilter corsFilter = new CorsFilter(source);
FilterRegistrationBean bean = new FilterRegistrationBean(corsFilter);
bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
return bean;
}
}
7.4.微服务用户鉴权拦截
当微服务收到明文token时,应该怎么鉴权拦截呢?自己实现一个filter ?自己解析明文token ,自己定义一套资源 访问策略?
能不能适配Spring Security呢,是不是突然想起了前面我们实现的Spring Security基于to ken认证例子。咱们还拿 统一用户服务作为网关下游糊艮务,对它进行改造,增加微服务用户鉴权拦截功能。
(1)增加测试资源
OrderController 增加以下 endpoint
@PreAuthorize(“hasAuthority(‘pl’)”)
@GetMapping(value - “/rl”)
public String rl(){
UserDTO user = (UserDTO)
SecurityContextHolder.getContext().getAuthentication().getPrincipal();
return user.getUsername() + “访问资源 1”;
}
@PreAuthorize(“hasAuthority(‘p2’)”)
@GetMapping(value - “/r2”)
public String r2(){//通过Spring Security AP工获取当前登录用户
UserDTO user =
(UserDTO)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
return user.getUsername() + “访问资源2”;
}
(2)Spring Security 配置
开启方法保护,并增加Spring配置策略,除了/login方法不受保护(统一认证要调用),其他资源全部需要认证才能访 问。
@Override
public void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers(”/**").access("#oauth2.hasScope(‘ROLE_ADMIN’)") .and().csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
综合上面的配置,咱们共定义了三个资源了 ,拥有p1权限可以访问r1资源,拥有p2权限可以访问r2资源,只要认 证通过就能访问r3资源。
(3 )定义filter拦截token ,并开,成Spring Security的Authentication对象
@Component
public class TokenAuthenticationFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest httpServletRequest^ HttpServletResponse httpServletResponseFilterchain filterchain) throws ServletExceptionlOException {
String token = httpServletRequest.getHeader(“json-token”);
if (token != null){
〃1.解析 token
String json = EncryptUtil.decodeUTF8StringBase64(token);
3SONObject userJson = 3SON.parseObject(json);
UserDTO user = new UserDTO();
user.setUsername(userJson.getString(“principal”));
3S0NArray authoritiesArray = userJson.get3S0NArray(“authorities”);
String [] authorities = authoritiesArray.toArray( new StringfauthoritiesArray.size()]);
//2.新建并填充 authentication
UsernamePasswordAuthenticationToken authentication = new
UsernamePasswordAuthenticationToken(
user, nullj AuthorityUtils.createAuthorityList(authorities));
authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails( httpServletRequest));
〃3.将authentication保存进安全上下文
SecurityContextHolder.getContext().setAuthentication(authentication);
}
filterchain.doFilter(httpServletRequesthttpServletResponse);
}
}
经过上边的过虑器,资源服务中就可以方便到的获取用户的身份信息:
UserDTO user = (UserDTO) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
还是三个步骤:
1 .解析 token
2.新建并填充 authentication
3.将authentication保存进安全上下文 剩下的事儿就交给Spring Security好了。
7.5.集成测试
本案例测试过程描述:
1、 采用。Auth2.0的密码模式从UAA获取token
2、 使用该token通过网关访问订单服务的测试资源
(1 )过网关访问uaa的授权及获取令牌,获取token。注意端口是53010 ,网关的端口。
如授权endpoint :
http://localhost:53010/uaa/oauth/authorize?response_type=code&client_id=cl
令牌 endpoint
http://localhost:53010/uaa/oauth/token
(2 )使用Token过网关访问订单服务中的r1-r2测试资源进行测试。
结果:
使用张三t。ken访问p1 ,访问成功
使用张三t。ken访问p2 ,访问失败
使用李四token访问p1 ,访问失败
使用李四token访问p2 ,访问成功
符合预期结果。
(3 )破坏token测试
无to ken测试返回内容:
{
“error”: “unauthorized”,
,error_description": “Full authentication is required to access this resource”
}
破坏token测试返回内容:
(
“error”: “invalid_token”,
“error_description”: “Cannot convert access token to 3SON”
}
7.6扩展用户信息
7.6.1需求分析
目前wt令牌存储了用户的身份信息、权限信息,网关将token明文化转发给微^务使用,目前用户身份信息仅包括 了用户的账号,微^务还需要用户的ID、手机号等重要信息。
所以,本案例将提供扩展用户信息的思路和方法,满足微服务使用用户信息的需求。
下边分析JM令牌中扩展用户信息的方案:
在认证阶段DaoAuthenticationProvider会调用UserDetailService查询用户的信息,这里是可以获取至!I齐全的用户 信息的。由于JWT令牌中用户身份信息来源于UserDetails , UserDetails中仅定义了username为用户的身份信息, 这里有两个思路:第一是可以扩展UserDetails ,使之包括更多的自定义属性,第二也可以扩展username的内容
,比如存入json数据内容作为username的内容。相比较而言,方案二比较简单还不用破坏UserDetails的结构,我 们采用方案二
7.6.2 修改 UserDetailService
从数据库查询到user,将整体user转成json存入UserDetails对象。
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
〃登录略
System.out.printIn(“username=”+username);
〃根据账号去数据库查询…
UserDto user = userDao.getUserByUsername(username);
if(user == null)(
return null;
}
〃查询用户权限
List permissions = userDao.findPermissionsByUserId(user.getId());
Stringf] perarray = new String[permissions.size()]; permissions.toArray(perarray);
〃创建 UserDetails
〃这里将user转为json,将整体user存入use「Details
String principal = JSON.toUSONString(user);
UserDetails UserDetails =
User.withUsername(principal).password(user.getPassword()).authorities(perarray)・ build(); return UserDetails;
}
7.6.3修改资源服务过虑器
资源^务中的过虑器负责从header中解析json-token ,从中即可拿网关放入的用户身份信息,部分关键代码如 下:
if (token != null){
〃1.解析 token
String json = EncryptUtil.decodeUTF8StringBase64(token);
DSONObject userJson = 3SON.parseObject(json);
〃取出用户身份信息
String principal = userJson.getString(“principal”);
〃将json转成又摻
UserDTO userDTO = JSON.parseObject(principalj UserDTO.class);
DSONArray authoritiesArray = userJson.get3S0NArray(“authorities”); 以建程就完成自定义用户身份信息的方案。
8.课程总结
重点回顾:
什么是认证、授权、鶴
Java Servlet为支持http会话做了哪些事儿。
基于session认证机制的运作流程。
基于token认证机制的运作流程。
理解Spring Security的工作原理,Spring Securit瘗构总览,认证流程和授权,中间涉及到哪些组件,这些组件分 别处理什么,如何自定义这些组件满足个性需求。
OAuth2.0认证的四种模式?它们的大体流程是什么?
Spring cloud Security OAuth2包括哪些组件?职责?
分做系统认证需要解决的问题?
掌握学习方法,掌握思考方式。
附录
HttpSecurity
HttpSecurity配置列表:
传智播客旗下 高端IT教育品牌
方法 说明
openidLogin() 用于基于Openld的验证
headers() 将安全标头添加到响应
cors() 配置跨域资源共享(CORS )
sessionManagement() 允许配置会话管理
portMapper() 允许配置一 PortMapper(HttpSecurity#(getSharedObject(class))),其他提供SecurityConfigurer的对象使用 PortMapper 从 HTTP 重定 向到HTTPS或者从HTTPS重定向到HTTP。默认情况下,Spring Security使用fPortMapperlmpI映射HTTP端口8080到HTTPS端口 8443 , HTTP 端口80到 HTTPS 端口443
jee() 配置基于容器的预认证。在这种1®兄下,认证由Servlet容器管理
x509() 配置基于X509的认证
rememberMe 允许配置”记住我啲验证
authorizeRequests() 允许基于使用H ttp Servlet Re questPO访问
requestCache() 允许配置请求缓存
exceptionHandlingO 允许配置筒吴处理
securityContext() 在HttpServletRequests之间的SecurityContextHolder上设置Securitycontext的管理。当使用WebSecurityConfigurerAdapter时,这将 自动应用
servletApi() 将HttpServletRequest方法与在其上找到的值集成到SecurityContext中。当使用WebSecurityConfigurerAdapterflyf,这将自动应用
csrf() 添加 CSRF 支持,使用WebSecurityConfigurerAdapter时,默认启用
logout() 添加退出登录支持。当使用WebSecurityConfigurerAdapterflyf,这将自动应用。默认情况是,访问URL"/ logout”,使HTTP Session无效来 清除用户,清除已配置的任何#rememberMe。身份验证,清除SecurityContextHolder,然后重定向至旳login?success”
anonymous() 允许配置匿名用户的表示方法。当与WebSecurityConfigurerAdapte偌合使用时,这将自动应用。默认帽兄下,匿名用户将使用 org.springframework.security.authentication.AnonymousAuthenticationfbken^^x ,并包含角色"ROLE_ANONYMOUS”
formLogin() 指定支持基于表单的身份验证。如果未指定FormLoginConfigurer#loginPage(String),则将生成默认登录页面
oauth2Login() 根据夕陪ISOAuth 2.0或OpenlD Connect 1.0提供程序配置身份验证
requiresChannel() 配置通道安全。为了使该配置有用,必须提供至公«到所需信道的映射
httpBasic() 配置Http Basic验证
addFilterAt() 由旨定的Filter类的位置添加过滤器

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/912733.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号