Spring Cloud Gateway 整合OAuth2.0 实现统一认证授权 | 您所在的位置:网站首页 › gateway网关统一授权认证合理吗 › Spring Cloud Gateway 整合OAuth2.0 实现统一认证授权 |
Spring Cloud Gateway 整合OAuth2.0 实现统一认证授权 https://blog.csdn.net/Pastxu/article/details/124538383 GateWay——向其他服务传递参数数据 https://blog.csdn.net/qq_38322527/article/details/126530849 需求随着微服务越来越多,把鉴权操作统一放到网关去做,如果微服务自己有额外的鉴权处理,可以在自己的微服务中处理。 1、在网关层完成url层面的鉴权操作。 所有的OPTION请求都放行。 所有不存在请求,直接都拒绝访问。 user-provider服务的findAllUsers需要 user.userInfo权限才可以访问。 2、将解析后的jwt token当做请求头传递到下游服务中。 3、整合Spring Security Oauth2 Resource Server四个角色 客户端:需要访问微服务资源 网关:负责转发、认证、鉴权 OAuth2.0授权服务:负责认证授权颁发令牌 微服务集合:提供资源的一系列服务。 流程说明授权服务器作为独立服务提供,用户登录请求通过网关转发到授权服务器。 认证和授权步骤,简单来说就是客户端根据约定的ClientID、ClientSecret、Scope来从Access Token URL地址获取AccessToken,并经过AuthURL认证,用得到的AccessToken来访问其他资源接口。 网关除负载转发请求外,还提供令牌(身份)认证和鉴权服务。当客户端访问资源时,请求先达到网关,网关检查携带的令牌是否合法和有效以及判断是否有权限访问资源后,再进行请求转发。 认证服务配置 @EnableAuthorizationServer 新建 AuthorizationServerConfig.java从数据库获取用户信息。 JwtAuthenticationProvider extends DaoAuthenticationProvider 网关服务作为Oauth2的资源服务、客户端服务使用,对访问微服务的请求进行统一的校验认证和鉴权操作。 需要配置的内容如下: 认证过滤器,其中利用了认证管理器对令牌的校验。 鉴权管理器、令牌失效异常处理、无权限访问异常处理。 白名单配置。 跨域过滤器的配置。在pom.xml中添加相关依赖,主要是Gateway、Oauth2和JWT相关依赖; https://blog.51cto.com/u_13626762/5227256 org.springframework.cloud spring-cloud-starter-oauth2 2.2.5.RELEASE org.springframework.security spring-security-oauth2-resource-server JWT令牌服务配置使用JWT令牌,配置要和认证服务的令牌配置相同。 认证管理的作用就是获取传递过来的令牌,对其进行解析、验签、过期时间判定。 新建JwtAuthenticationManager,实现ReactiveAuthenticationManager接口。 经过认证管理器认证成功后,就需要对令牌进行鉴权,如果该令牌无访问资源的权限,则不允通过。 新建JwtAccessManager,实现ReactiveAuthorizationManager 返回自定义的异常信息。 令牌无效或者过期时定制结果如果令牌失效或者过期,则会直接返回,这里需要定制提示信息。 新建RequestAuthenticationEntryPoint,实现ServerAuthenticationEntryPoint 无权限时的定制结果鉴权的过程中,如果无该权限,也是会直接返回,这里也需要定制提示信息。 新建RequestAccessDeniedHandler,实现ServerAccessDeniedHandler @EnableWebFluxSecurityOAuth2相关组件已经准备就绪,现在直接配置到OAuth2中。 新建WebFluxSecurityConfig配置类,标注注解 @EnableWebFluxSecurity @Configuration @EnableWebFluxSecurity public class WebFluxSecurityConfig { @Resource private JwtAuthenticationManager jwtAuthenticationManager; //token管理器 @Resource private JwtAccessManager jwtAccessManager; //private final IgnoreUrlsConfig ignoreUrlsConfig; //白名单配置 //认证服务器 配置用户认证 @Bean public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) { log.info("init WebFluxSecurity SecurityWebFilterChain"); // //通过认证管理器进行令牌校验 // //认证过滤器 AuthenticationWebFilter authenticationWebFilter = new AuthenticationWebFilter(jwtAuthenticationManager); authenticationWebFilter.setServerAuthenticationConverter(new ServerBearerTokenAuthenticationConverter()); return http .httpBasic().disable() .csrf().disable() .authorizeExchange() //鉴权... 略 .pathMatchers(HttpMethod.OPTIONS).permitAll() .anyExchange().access(jwtAccessManager) .and() //token认证过滤器 .addFilterAt(authenticationWebFilter, SecurityWebFiltersOrder.AUTHENTICATION) .build(); } } GlobalFilter 配置全局过滤器网关认证鉴权成功后,下游微服务获取到当前用户的详细信息。 由于在网关层面已经做了鉴权了(细化到每个URI),因此微服务就不用集成Spring Security单独做权限控制了。 新建一个过滤器AuthenticationFilter,用于解密网关传递的用户数据 @Component public class AuthenticationFilter extends OncePerRequestFilter { // }新建两个接口,返回当前登录的用户信息 @RestController @RequestMapping("/order") public class UserController { @RequestMapping("/login/info") public String info() { return OauthUtils.getCurrentUser(); } @RequestMapping("/login/admin") public String admin(){ return OauthUtils.getCurrentUser(); } } 测试同时启动三个服务 问题 使用TokenEnhancer 导致 access_token不是jwt格式了实现TokenEnhancer,自定义token导致access_token不是jwt格式。 AccessTokenConverter 作用是把token字符串转换成OAuth2AccessToken对象。 TokenEnhancer作用是在OAuth2AccessToken 里添加额外的信息。 JwtAccessTokenConverter 即实现了AccessTokenConverter接口,也实现了TokenEnhancer接口。 链接:https://blog.csdn.net/qq_19636353/article/details/126987926 { "access_token": "d2b97ea9-4cea-4f8b-9832-228bbd6ba985", "token_type": "bearer", "refresh_token": "b557e569-1b9e-46e8-af39-725c38f482a5", "expires_in": 3599, "scope": "all", "user_id": "101" } 设置tokenServices()使用JWT替换Token 及 JWT内容增强 https://blog.csdn.net/qq_43692950/article/details/122525414
|
CopyRight 2018-2019 实验室设备网 版权所有 |