{"id":40366,"date":"2023-01-04T21:53:07","date_gmt":"2024-02-21T15:56:56","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8spring-cloud-gateway%e8%bf%9b%e8%a1%8coauth2%e8%ae%a4%e8%af%81%e3%80%82\/"},"modified":"2024-04-29T08:34:09","modified_gmt":"2024-04-29T00:34:09","slug":"%e4%bd%bf%e7%94%a8spring-cloud-gateway%e8%bf%9b%e8%a1%8coauth2%e8%ae%a4%e8%af%81%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8spring-cloud-gateway%e8%bf%9b%e8%a1%8coauth2%e8%ae%a4%e8%af%81%e3%80%82\/","title":{"rendered":"\u4f7f\u7528Spring Cloud Gateway\u8fdb\u884cOAuth2\u8ba4\u8bc1"},"content":{"rendered":"<p>\u4ee5\u4e0b\u662f\u539f\u59cb\u8d44\u6599\u3002<\/p>\n<p>\u6211\u8bd5\u7740\u4f7f\u7528Spring Cloud Gateway\u4f5c\u4e3a\u4e00\u4e2a\u7c7b\u4f3c\u4e8e\u9632\u706b\u5899\u7684\u4e1c\u897f\uff0c\u867d\u7136\u5b83\u4f3c\u4e4e\u662f\u7528\u4e8e\u4f7f\u7528\u5fae\u670d\u52a1\u7684\u3002<\/p>\n<h2>\u6784\u6210<\/h2>\n<p>\u4e0b\u9762\u6211\u4f1a\u4f7f\u7528\u4ee5\u4e0b\u4e24\u4e2a\u670d\u52a1\uff1a<br \/>\n[\u4e91\u7f51\u5173]<br \/>\n[API]<\/p>\n<p>\u901a\u8fc7[\u4e91\u7f51\u5173]\u8bbf\u95eeREST\u670d\u52a1\u5668\u7684API\u3002[\u4e91\u7f51\u5173]\u9700\u8981\u8fdb\u884cOAuth2\u8ba4\u8bc1\u3002<\/p>\n<h2>OAuth2\u8ba4\u8bc1\u670d\u52a1\u5668<\/h2>\n<h3>\u4f7f\u7528Docker\u542f\u52a8Keycloak\u3002<\/h3>\n<p>\u4f7f\u7528Docker\u542f\u52a8keycloak\u670d\u52a1\u5668\u3002<br \/>\n\u4ee5\u4e0b\u9009\u62e9\u4e86Docker Compose\u4e2d\u7684postgresql\u3002<\/p>\n<p>\u4ee5\u4e0b\u662fKeycloak\u63a7\u5236\u53f0\u7684\u57fa\u672c\u64cd\u4f5c\uff1a<br \/>\nhttps:\/\/www.keycloak.org\/getting-started\/getting-started-docker<\/p>\n<p>\u7528\u6237\u4eec\uff0c\u4e3a\u4e86\u6301\u4e45\u5316keycloak\u8bbe\u7f6e\uff0c\u5c06\u8fde\u63a5\u672c\u5730\u7684postgresql\uff08\u540c\u6837\u662f\u901a\u8fc7Docker\u8fde\u63a5\uff09\u3002\u53c2\u7167\u4ee5\u4e0b\u5185\u5bb9\u8fdb\u884c\u64cd\u4f5c\u3002<\/p>\n<p>docker-compose.yml\u7684\u5185\u5bb9\u5982\u4e0b\u3002<\/p>\n<pre class=\"post-pre\"><code>\r\nversion: '3'\r\n\r\nvolumes:\r\n  postgres_data:\r\n      driver: local\r\n\r\nservices:\r\n  postgres:\r\n      image: postgres\r\n      volumes:\r\n        - postgres_data:\/var\/lib\/postgresql\/data\r\n        - .\/docker-entrypoint-initdb.d:\/docker-entrypoint-initdb.d\r\n      environment:\r\n        POSTGRES_DB: keycloak\r\n        POSTGRES_USER: keycloak\r\n        POSTGRES_PASSWORD: password\r\n  keycloak:\r\n      image: quay.io\/keycloak\/keycloak:latest\r\n      environment:\r\n        DB_VENDOR: POSTGRES\r\n        DB_ADDR: postgres\r\n        DB_DATABASE: keycloak\r\n        DB_USER: keycloak\r\n        DB_SCHEMA: public\r\n        DB_PASSWORD: password\r\n        KEYCLOAK_USER: admin\r\n        KEYCLOAK_PASSWORD: Pa55w0rd\r\n        # Uncomment the line below if you want to specify JDBC parameters. The parameter below is just an example, and it shouldn't be used in production without knowledge. It is highly recommended that you read the PostgreSQL JDBC driver documentation in order to use it.\r\n        #JDBC_PARAMS: \"ssl=true\"\r\n      ports:\r\n        - 8080:8080\r\n      depends_on:\r\n        - postgres\r\n<\/code><\/pre>\n<h3>\u521b\u5efa\u9886\u57df\u3001\u5ba2\u6237\u7aef\u548c\u7528\u6237<\/h3>\n<p>\u5728\u4e0b\u9762\u6253\u5f00Keycloak\u7684\u7ba1\u7406\u63a7\u5236\u53f0\u3002<br \/>\n\u8d26\u6237\u548c\u5bc6\u7801\u5728docker-compose.yml\u6587\u4ef6\u4e2d\u3002<\/p>\n<p>\u767b\u5f55\u540e\u5c06\u663e\u793a\u5982\u4e0b\u753b\u9762\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d403237434c4406c9117f\/19-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2020-11-05 21.54.37.png\" \/><\/div>\n<p>\u8bbe\u5b9a\u5982\u4e0b\uff1a<\/p>\n<p>\u738b\u56fd\uff1a\u6211\u7684\u738b\u56fd<\/p>\n<p>\u5ba2\u6237\u7aefID\uff1aspring-client<\/p>\n<p>\u8bbf\u95ee\u7c7b\u578b\uff1a\u4fdd\u5bc6<\/p>\n<p>\u6709\u6548\u7684\u91cd\u5b9a\u5411URL\uff1a<br \/>\nhttp:\/\/localhost:8082\/*<\/p>\n<p>\u7528\u6237\u540d\uff1a\u6211\u7684\u7528\u6237\u540d<\/p>\n<h3>\u8d44\u683c\/\u8bc1\u4e66<\/h3>\n<p>\u6211\u7684\u7528\u6237\u540d\u548c\u5bc6\u7801<\/p>\n<h2>Spring Cloud \u7f51\u5173<\/h2>\n<h3>\u8bf7\u63d0\u4f9b\u4ee5\u4e0b\u5185\u5bb9\u7684\u4e2d\u6587\u672c\u5730\u5316\u7248\u672c\uff0c\u53ea\u9700\u4e00\u4e2a\u9009\u9879\uff1a<\/h3>\n<p>\u53c2\u8003\u8d44\u6599<\/p>\n<p>\u6211\u53c2\u8003\u4e86\u4ee5\u4e0b\u7f51\u7ad9\u7684\u5185\u5bb9\uff0c\u5bf9pom.xml\u548cconfig\u8fdb\u884c\u4e86\u8bbe\u7f6e\u3002<\/p>\n<p>\u7531\u4e8eSpring Cloud Gateway\u91c7\u7528\u4e86Webflux\uff0c\u6240\u4ee5\u53ef\u4ee5\u5982\u4e0b\u6240\u793a\u3002<\/p>\n<p>pom.xml\u6587\u4ef6<\/p>\n<pre class=\"post-pre\"><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\r\n&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\" xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\r\n         xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 https:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\"&gt;\r\n    &lt;modelVersion&gt;4.0.0&lt;\/modelVersion&gt;\r\n    &lt;parent&gt;\r\n        &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\r\n        &lt;artifactId&gt;spring-boot-starter-parent&lt;\/artifactId&gt;\r\n        &lt;version&gt;2.3.4.RELEASE&lt;\/version&gt;\r\n        &lt;relativePath\/&gt; &lt;!-- lookup parent from repository --&gt;\r\n    &lt;\/parent&gt;\r\n    &lt;groupId&gt;com.example&lt;\/groupId&gt;\r\n    &lt;artifactId&gt;cloud-gateway&lt;\/artifactId&gt;\r\n    &lt;version&gt;0.0.1-SNAPSHOT&lt;\/version&gt;\r\n    &lt;name&gt;cloud-gateway&lt;\/name&gt;\r\n    &lt;description&gt;Demo project for Spring Boot&lt;\/description&gt;\r\n\r\n    &lt;properties&gt;\r\n        &lt;java.version&gt;11&lt;\/java.version&gt;\r\n        &lt;spring-cloud.version&gt;Hoxton.SR8&lt;\/spring-cloud.version&gt;\r\n    &lt;\/properties&gt;\r\n\r\n    &lt;dependencies&gt;\r\n\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;spring-boot-starter-oauth2-client&lt;\/artifactId&gt;\r\n        &lt;\/dependency&gt;\r\n\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;org.springframework.cloud&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;spring-cloud-starter-gateway&lt;\/artifactId&gt;\r\n        &lt;\/dependency&gt;\r\n\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;org.springframework.cloud&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;spring-cloud-starter-security&lt;\/artifactId&gt;\r\n        &lt;\/dependency&gt;\r\n\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;spring-boot-starter-test&lt;\/artifactId&gt;\r\n            &lt;scope&gt;test&lt;\/scope&gt;\r\n            &lt;exclusions&gt;\r\n                &lt;exclusion&gt;\r\n                    &lt;groupId&gt;org.junit.vintage&lt;\/groupId&gt;\r\n                    &lt;artifactId&gt;junit-vintage-engine&lt;\/artifactId&gt;\r\n                &lt;\/exclusion&gt;\r\n            &lt;\/exclusions&gt;\r\n        &lt;\/dependency&gt;\r\n    &lt;\/dependencies&gt;\r\n\r\n    &lt;dependencyManagement&gt;\r\n        &lt;dependencies&gt;\r\n            &lt;dependency&gt;\r\n                &lt;groupId&gt;org.springframework.cloud&lt;\/groupId&gt;\r\n                &lt;artifactId&gt;spring-cloud-dependencies&lt;\/artifactId&gt;\r\n                &lt;version&gt;${spring-cloud.version}&lt;\/version&gt;\r\n                &lt;type&gt;pom&lt;\/type&gt;\r\n                &lt;scope&gt;import&lt;\/scope&gt;\r\n            &lt;\/dependency&gt;\r\n        &lt;\/dependencies&gt;\r\n    &lt;\/dependencyManagement&gt;\r\n\r\n    &lt;build&gt;\r\n        &lt;plugins&gt;\r\n            &lt;plugin&gt;\r\n                &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\r\n                &lt;artifactId&gt;spring-boot-maven-plugin&lt;\/artifactId&gt;\r\n            &lt;\/plugin&gt;\r\n        &lt;\/plugins&gt;\r\n    &lt;\/build&gt;\r\n\r\n&lt;\/project&gt;\r\n\r\n<\/code><\/pre>\n<p>\u5728\u4f7f\u7528WebFlux\u548cSpring Security\u65f6\uff0c\u9700\u8981\u4f7f\u7528@EnableWebFluxSecurity\u6ce8\u89e3\u3002<\/p>\n<p>\u5b89\u5168\u914d\u7f6e.java<\/p>\n<pre class=\"post-pre\"><code><span class=\"kn\">package<\/span> <span class=\"nn\">com.example.cloudgateway.config<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.context.annotation.Bean<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.context.annotation.Configuration<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.security.config.web.server.ServerHttpSecurity<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.security.oauth2.client.registration.ReactiveClientRegistrationRepository<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.security.web.server.SecurityWebFilterChain<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.stereotype.Component<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">static<\/span> <span class=\"n\">org<\/span><span class=\"o\">.<\/span><span class=\"na\">springframework<\/span><span class=\"o\">.<\/span><span class=\"na\">security<\/span><span class=\"o\">.<\/span><span class=\"na\">config<\/span><span class=\"o\">.<\/span><span class=\"na\">Customizer<\/span><span class=\"o\">.<\/span><span class=\"na\">withDefaults<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"nd\">@Configuration<\/span>\r\n<span class=\"nd\">@EnableWebFluxSecurity<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">SecurityConfig<\/span> <span class=\"o\">{<\/span>\r\n\r\n    <span class=\"nd\">@Bean<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">SecurityWebFilterChain<\/span> <span class=\"nf\">springSecurityFilterChain<\/span><span class=\"o\">(<\/span><span class=\"nc\">ServerHttpSecurity<\/span> <span class=\"n\">http<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"n\">http<\/span><span class=\"o\">.<\/span><span class=\"na\">authorizeExchange<\/span><span class=\"o\">(<\/span><span class=\"n\">exchanges<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"n\">exchanges<\/span><span class=\"o\">.<\/span><span class=\"na\">anyExchange<\/span><span class=\"o\">().<\/span><span class=\"na\">authenticated<\/span><span class=\"o\">())<\/span>\r\n                <span class=\"o\">.<\/span><span class=\"na\">oauth2Login<\/span><span class=\"o\">(<\/span><span class=\"n\">withDefaults<\/span><span class=\"o\">());<\/span>\r\n        <span class=\"n\">http<\/span><span class=\"o\">.<\/span><span class=\"na\">csrf<\/span><span class=\"o\">().<\/span><span class=\"na\">disable<\/span><span class=\"o\">();<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">http<\/span><span class=\"o\">.<\/span><span class=\"na\">build<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n<span class=\"o\">}<\/span>\r\n\r\n<\/code><\/pre>\n<p>\u5728application.yml\u4e2d\uff0c\u914d\u7f6eoauth2\u8ba4\u8bc1\u5e76\u5c06\u5176\u8def\u7531\u5230API\u670d\u52a1\u5668\u3002<br \/>\n\u6709\u5173Keycloak\u7684\u914d\u7f6e\u53ef\u4ee5\u5728Keycloak\u7ba1\u7406\u63a7\u5236\u53f0\u4e2d\u53c2\u8003\u4ee5\u4e0b\u4fe1\u606f\u3002<\/p>\n<p>\u5e94\u7528\u7a0b\u5e8f\u914d\u7f6e\u6587\u4ef6.yml\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"na\">server<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">port<\/span><span class=\"pi\">:<\/span> <span class=\"m\">8082<\/span>\r\n  <span class=\"na\">servlet<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">context-path<\/span><span class=\"pi\">:<\/span> <span class=\"s\">gw<\/span>\r\n\r\n<span class=\"na\">spring<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">cloud<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">gateway<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"na\">routes<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"pi\">-<\/span> <span class=\"na\">id<\/span><span class=\"pi\">:<\/span> <span class=\"s\">path_route<\/span>\r\n          <span class=\"na\">uri<\/span><span class=\"pi\">:<\/span> <span class=\"s\">http:\/\/localhost:8081<\/span>\r\n          <span class=\"na\">predicates<\/span><span class=\"pi\">:<\/span>\r\n            <span class=\"pi\">-<\/span> <span class=\"s\">Path=\/gw\/api\/{segment}<\/span>\r\n          <span class=\"na\">filters<\/span><span class=\"pi\">:<\/span>\r\n            <span class=\"pi\">-<\/span> <span class=\"s\">SetPath=\/api\/{segment}<\/span>\r\n  <span class=\"na\">security<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">oauth2<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"na\">client<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"na\">provider<\/span><span class=\"pi\">:<\/span>\r\n          <span class=\"na\">keycloak<\/span><span class=\"pi\">:<\/span>\r\n            <span class=\"na\">token-uri<\/span><span class=\"pi\">:<\/span> <span class=\"s\">http:\/\/localhost:8080\/auth\/realms\/myrealm\/protocol\/openid-connect\/token<\/span>\r\n            <span class=\"na\">authorization-uri<\/span><span class=\"pi\">:<\/span> <span class=\"s\">http:\/\/localhost:8080\/auth\/realms\/myrealm\/protocol\/openid-connect\/auth<\/span>\r\n            <span class=\"na\">userinfo-uri<\/span><span class=\"pi\">:<\/span> <span class=\"s\">http:\/\/localhost:8080\/auth\/realms\/myrealm\/protocol\/openid-connect\/userinfo<\/span>\r\n            <span class=\"na\">user-name-attribute<\/span><span class=\"pi\">:<\/span> <span class=\"s\">preferred_username<\/span>\r\n        <span class=\"na\">registration<\/span><span class=\"pi\">:<\/span>\r\n          <span class=\"na\">keycloak-dev<\/span><span class=\"pi\">:<\/span>\r\n            <span class=\"na\">provider<\/span><span class=\"pi\">:<\/span> <span class=\"s\">keycloak<\/span>\r\n            <span class=\"na\">client-id<\/span><span class=\"pi\">:<\/span> <span class=\"s\">spring-client<\/span>\r\n            <span class=\"na\">client-secret<\/span><span class=\"pi\">:<\/span> <span class=\"s\">d7360530-4071-4a80-96fa-d711144fb3f3<\/span>\r\n            <span class=\"na\">authorization-grant-type<\/span><span class=\"pi\">:<\/span> <span class=\"s\">authorization_code<\/span>\r\n            <span class=\"na\">redirect-uri<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">{baseUrl}\/login\/oauth2\/code\/keycloak\"<\/span>\r\n\r\n<span class=\"s\">logging.level<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"s\">org.springframework.cloud.gateway<\/span><span class=\"pi\">:<\/span> <span class=\"s\">DEBUG<\/span>\r\n  <span class=\"s\">org.springframework.security<\/span><span class=\"pi\">:<\/span> <span class=\"s\">DEBUG<\/span>\r\n  <span class=\"s\">org.springframework.web.reactive.function.client<\/span><span class=\"pi\">:<\/span> <span class=\"s\">TRACE<\/span>\r\n<\/code><\/pre>\n<p>REST\u4fa7\u901a\u5e38\u4f1a\u521b\u5efa\u63a7\u5236\u5668\uff0c\u5e76\u57288081\u7aef\u53e3\u542f\u52a8\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"kn\">package<\/span> <span class=\"nn\">com.example.api<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.boot.SpringApplication<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.boot.autoconfigure.SpringBootApplication<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.web.bind.annotation.GetMapping<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.web.bind.annotation.RestController<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"nd\">@SpringBootApplication<\/span>\r\n<span class=\"nd\">@RestController<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">ApiApplication<\/span> <span class=\"o\">{<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">main<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">args<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"nc\">SpringApplication<\/span><span class=\"o\">.<\/span><span class=\"na\">run<\/span><span class=\"o\">(<\/span><span class=\"nc\">ApiApplication<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">,<\/span> <span class=\"n\">args<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"nd\">@GetMapping<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\/test\"<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"nc\">String<\/span> <span class=\"nf\">home<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"s\">\"Hello Api\"<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u5f53\u60a8\u8bbf\u95ee\u4ee5\u4e0b\u7f51\u5740\u65f6\uff0c\u5c06\u4f1a\u663e\u793a Keycloak \u7684\u767b\u5f55\u754c\u9762\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d403237434c4406c9117f\/47-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2020-11-05 21.28.49.png\" \/><\/div>\n<p>\u4f7f\u7528myuser\/mypwd\u767b\u5f55\u540e\uff0c\u5c06\u663e\u793a\u300cHello Api\u300d\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4ee5\u4e0b\u662f\u539f\u59cb\u8d44\u6599\u3002 \u6211\u8bd5\u7740\u4f7f\u7528Spring Cloud Gateway\u4f5c\u4e3a\u4e00\u4e2a\u7c7b\u4f3c\u4e8e\u9632\u706b\u5899\u7684\u4e1c\u897f\uff0c\u867d\u7136\u5b83\u4f3c\u4e4e\u662f\u7528 [&hellip;]<\/p>\n","protected":false},"author":10,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-40366","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u4f7f\u7528Spring Cloud Gateway\u8fdb\u884cOAuth2\u8ba4\u8bc1 - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528spring-cloud-gateway\u8fdb\u884coauth2\u8ba4\u8bc1\u3002\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u4f7f\u7528Spring Cloud Gateway\u8fdb\u884cOAuth2\u8ba4\u8bc1\" \/>\n<meta property=\"og:description\" content=\"\u4ee5\u4e0b\u662f\u539f\u59cb\u8d44\u6599\u3002 \u6211\u8bd5\u7740\u4f7f\u7528Spring Cloud Gateway\u4f5c\u4e3a\u4e00\u4e2a\u7c7b\u4f3c\u4e8e\u9632\u706b\u5899\u7684\u4e1c\u897f\uff0c\u867d\u7136\u5b83\u4f3c\u4e4e\u662f\u7528 [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528spring-cloud-gateway\u8fdb\u884coauth2\u8ba4\u8bc1\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2024-02-21T15:56:56+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-29T00:34:09+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d403237434c4406c9117f\/19-0.png\" \/>\n<meta name=\"author\" content=\"\u5b87, \u534e\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u5b87, \u534e\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8spring-cloud-gateway%e8%bf%9b%e8%a1%8coauth2%e8%ae%a4%e8%af%81%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8spring-cloud-gateway%e8%bf%9b%e8%a1%8coauth2%e8%ae%a4%e8%af%81%e3%80%82\/\",\"name\":\"\u4f7f\u7528Spring Cloud Gateway\u8fdb\u884cOAuth2\u8ba4\u8bc1 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2024-02-21T15:56:56+00:00\",\"dateModified\":\"2024-04-29T00:34:09+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8spring-cloud-gateway%e8%bf%9b%e8%a1%8coauth2%e8%ae%a4%e8%af%81%e3%80%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8spring-cloud-gateway%e8%bf%9b%e8%a1%8coauth2%e8%ae%a4%e8%af%81%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8spring-cloud-gateway%e8%bf%9b%e8%a1%8coauth2%e8%ae%a4%e8%af%81%e3%80%82\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u4f7f\u7528Spring Cloud Gateway\u8fdb\u884cOAuth2\u8ba4\u8bc1\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458\",\"name\":\"\u5b87, \u534e\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g\",\"caption\":\"\u5b87, \u534e\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/yuhua\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8spring-cloud-gateway%e8%bf%9b%e8%a1%8coauth2%e8%ae%a4%e8%af%81%e3%80%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u4f7f\u7528Spring Cloud Gateway\u8fdb\u884cOAuth2\u8ba4\u8bc1 - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528spring-cloud-gateway\u8fdb\u884coauth2\u8ba4\u8bc1\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"\u4f7f\u7528Spring Cloud Gateway\u8fdb\u884cOAuth2\u8ba4\u8bc1","og_description":"\u4ee5\u4e0b\u662f\u539f\u59cb\u8d44\u6599\u3002 \u6211\u8bd5\u7740\u4f7f\u7528Spring Cloud Gateway\u4f5c\u4e3a\u4e00\u4e2a\u7c7b\u4f3c\u4e8e\u9632\u706b\u5899\u7684\u4e1c\u897f\uff0c\u867d\u7136\u5b83\u4f3c\u4e4e\u662f\u7528 [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528spring-cloud-gateway\u8fdb\u884coauth2\u8ba4\u8bc1\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2024-02-21T15:56:56+00:00","article_modified_time":"2024-04-29T00:34:09+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d403237434c4406c9117f\/19-0.png"}],"author":"\u5b87, \u534e","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u5b87, \u534e","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"4 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8spring-cloud-gateway%e8%bf%9b%e8%a1%8coauth2%e8%ae%a4%e8%af%81%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8spring-cloud-gateway%e8%bf%9b%e8%a1%8coauth2%e8%ae%a4%e8%af%81%e3%80%82\/","name":"\u4f7f\u7528Spring Cloud Gateway\u8fdb\u884cOAuth2\u8ba4\u8bc1 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2024-02-21T15:56:56+00:00","dateModified":"2024-04-29T00:34:09+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8spring-cloud-gateway%e8%bf%9b%e8%a1%8coauth2%e8%ae%a4%e8%af%81%e3%80%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8spring-cloud-gateway%e8%bf%9b%e8%a1%8coauth2%e8%ae%a4%e8%af%81%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8spring-cloud-gateway%e8%bf%9b%e8%a1%8coauth2%e8%ae%a4%e8%af%81%e3%80%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u4f7f\u7528Spring Cloud Gateway\u8fdb\u884cOAuth2\u8ba4\u8bc1"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458","name":"\u5b87, \u534e","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g","caption":"\u5b87, \u534e"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/yuhua\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8spring-cloud-gateway%e8%bf%9b%e8%a1%8coauth2%e8%ae%a4%e8%af%81%e3%80%82\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/40366","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=40366"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/40366\/revisions"}],"predecessor-version":[{"id":84184,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/40366\/revisions\/84184"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=40366"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=40366"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=40366"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}