{"id":39940,"date":"2023-09-20T07:53:57","date_gmt":"2023-07-25T06:20:43","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot%e5%92%8cspring-security-oauth2%e6%9d%a5%e8%87%aa%e5%ae%9a%e4%b9%89oauth%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%b9%b6%e8%bf%9b%e8%a1%8c%e8%ae%a4%e8%af%81%e3%80%82\/"},"modified":"2024-05-04T00:38:25","modified_gmt":"2024-05-03T16:38:25","slug":"%e4%bd%bf%e7%94%a8springboot%e5%92%8cspring-security-oauth2%e6%9d%a5%e8%87%aa%e5%ae%9a%e4%b9%89oauth%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%b9%b6%e8%bf%9b%e8%a1%8c%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%a8springboot%e5%92%8cspring-security-oauth2%e6%9d%a5%e8%87%aa%e5%ae%9a%e4%b9%89oauth%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%b9%b6%e8%bf%9b%e8%a1%8c%e8%ae%a4%e8%af%81%e3%80%82\/","title":{"rendered":"\u4f7f\u7528SpringBoot\u548cSpring Security OAuth2\u6765\u81ea\u5b9a\u4e49OAuth\u670d\u52a1\u5668\u5e76\u8fdb\u884c\u8ba4\u8bc1"},"content":{"rendered":"<h1>\u9996\u5148<\/h1>\n<h2>\u4f7f\u7528\u7684\u7269\u54c1 de<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Eclipse<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Gradle<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u8a8d\u8a3c\u30b5\u30fc\u30d0\u3053\u3053\u3067\u4f5c\u6210\u3057\u305f\u3082\u306e<\/ul>\n<h2>\u5b89\u88c5<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Eclipse Market Place\u304b\u3089<\/ul>\n<\/li>\n<\/ul>\n<p>Gradle IDE Pack<br \/>\nSpring Tool Suite<\/p>\n<h1>\u9879\u76ee\u8bbe\u7f6e<\/h1>\n<h2>\u5b8c\u6210\u9879\u76ee<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Eclipse &#8211; File &#8211; New &#8211; Project&#8230;<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Gradle &#8211; Gradle Project<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">Project name\u306b\u4efb\u610f\u306e\u540d\u524d\u3001Sample Project\u306bJava Quick start\u3092\u9078\u629e<\/ul>\n<div><img decoding=\"async\" class=\"post-images\" title=\"Kobito.7FuXjY.png\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d3d6937434c4406c87c0c\/8-0.png\" alt=\"Kobito.7FuXjY.png\" \/><\/div>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u4e0d\u8981\u306a\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u524a\u9664<\/ul>\n<\/li>\n<\/ul>\n<p>src\/main\/java \u914d\u4e0b<br \/>\nsrc\/main\/resources \u914d\u4e0b<br \/>\nsrc\/test\/java \u914d\u4e0b<br \/>\nsrc\/test\/resources \u914d\u4e0b<\/p>\n<h2>\u4f7f\u7528 Gradle \u5b89\u88c5\u4f9d\u8d56\u5305<\/h2>\n<ul class=\"post-ul\">package version\u60c5\u5831\u3092\u5916\u51fa\u3057\u3059\u308b\u305f\u3081\u3001project\u76f4\u4e0b\u306bgradle.properties\u30d5\u30a1\u30a4\u30eb\u3092\u4f5c\u6210\u3057\u4ee5\u4e0b\u306e\u8a18\u8ff0<\/ul>\n<pre class=\"post-pre\"><code><span class=\"py\">SPRING_BOOT_VERSION<\/span><span class=\"p\">=<\/span><span class=\"s\">1.3.2.RELEASE<\/span>\r\n<span class=\"py\">SPRING_LOADED_VERSION<\/span><span class=\"p\">=<\/span><span class=\"s\">1.2.5.RELEASE<\/span>\r\n<span class=\"py\">JAVA_VERSION<\/span><span class=\"p\">=<\/span><span class=\"s\">1.8<\/span>\r\n<span class=\"py\">POSTGRES_VERSION<\/span><span class=\"p\">=<\/span><span class=\"s\">9.4-1200-jdbc41<\/span>\r\n<span class=\"py\">SPRING_CORE_VERSION<\/span><span class=\"p\">=<\/span><span class=\"s\">4.2.4.RELEASE<\/span>\r\n<\/code><\/pre>\n<ul class=\"post-ul\">build.gradle\u306b\u4f9d\u5b58\u30d1\u30c3\u30b1\u30fc\u30b8\u60c5\u5831\u3092\u8a18\u8ff0<\/ul>\n<pre class=\"post-pre\"><code><span class=\"k\">buildscript<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"k\">repositories<\/span> <span class=\"o\">{<\/span>\r\n      <span class=\"n\">mavenCentral<\/span><span class=\"o\">()<\/span>\r\n      <span class=\"n\">maven<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"n\">url<\/span> <span class=\"s2\">\"https:\/\/plugins.gradle.org\/m2\/\"<\/span>\r\n      <span class=\"o\">}<\/span>\r\n    <span class=\"o\">}<\/span>\r\n    <span class=\"k\">dependencies<\/span> <span class=\"o\">{<\/span>\r\n      <span class=\"n\">classpath<\/span> <span class=\"s2\">\"org.springframework.boot:spring-boot-gradle-plugin:${SPRING_BOOT_VERSION}\"<\/span>\r\n      <span class=\"n\">classpath<\/span> <span class=\"s2\">\"org.springframework:springloaded:${SPRING_LOADED_VERSION}\"<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n\r\n<span class=\"n\">apply<\/span> <span class=\"nl\">plugin:<\/span> <span class=\"s1\">'java'<\/span>\r\n<span class=\"n\">apply<\/span> <span class=\"nl\">plugin:<\/span> <span class=\"s1\">'spring-boot'<\/span>\r\n\r\n<span class=\"n\">sourceCompatibility<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">\"${JAVA_VERSION}\"<\/span>\r\n<span class=\"n\">targetCompatibility<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">\"${JAVA_VERSION}\"<\/span>\r\n\r\n<span class=\"k\">repositories<\/span> <span class=\"o\">{<\/span>\r\n  <span class=\"n\">mavenCentral<\/span><span class=\"o\">()<\/span>\r\n<span class=\"o\">}<\/span>\r\n\r\n<span class=\"n\">jar<\/span><span class=\"o\">.<\/span><span class=\"na\">baseName<\/span> <span class=\"o\">=<\/span> <span class=\"s1\">'springboot-oauth-sample'<\/span>\r\n\r\n<span class=\"k\">dependencies<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"c1\">\/\/ for web application<\/span>\r\n    <span class=\"n\">compile<\/span> <span class=\"s2\">\"org.springframework.boot:spring-boot-starter-web:${SPRING_BOOT_VERSION}\"<\/span>\r\n\r\n    <span class=\"c1\">\/\/ template engine: jade<\/span>\r\n    <span class=\"n\">compile<\/span> <span class=\"s2\">\"com.domingosuarez.boot:spring-boot-starter-jade4j:0.3.0\"<\/span>\r\n\r\n    <span class=\"c1\">\/\/ use spring security<\/span>\r\n    <span class=\"n\">compile<\/span> <span class=\"s2\">\"org.springframework.boot:spring-boot-starter-security:${SPRING_BOOT_VERSION}\"<\/span>\r\n\r\n    <span class=\"c1\">\/\/ use spring security oauth2<\/span>\r\n    <span class=\"n\">compile<\/span> <span class=\"s2\">\"org.springframework.security.oauth:spring-security-oauth2:2.0.7.RELEASE\"<\/span>\r\n\r\n    <span class=\"c1\">\/\/ use configuration processor<\/span>\r\n    <span class=\"n\">compile<\/span> <span class=\"s2\">\"org.springframework.boot:spring-boot-configuration-processor:1.2.5.RELEASE\"<\/span>\r\n\r\n    <span class=\"c1\">\/\/ use spring core<\/span>\r\n    <span class=\"n\">compile<\/span> <span class=\"s2\">\"org.springframework:spring-core:${SPRING_CORE_VERSION}\"<\/span>\r\n\r\n    <span class=\"c1\">\/\/ use Scribe OAuth<\/span>\r\n    <span class=\"n\">compile<\/span> <span class=\"s2\">\"com.github.scribejava:scribejava-apis:2.2.2\"<\/span>\r\n\r\n<span class=\"o\">}<\/span>\r\n\r\n<\/code><\/pre>\n<ul class=\"post-ul\">Project\u53f3\u30af\u30ea\u30c3\u30af &#8211; Gradle &#8211; Refresh All<\/ul>\n<h1>\u7f16\u7801<\/h1>\n<h2>\u521b\u5efa\u5165\u53e3\u70b9<\/h2>\n<ul class=\"post-ul\">src\/main\/java\u3092\u53f3\u30af\u30ea\u30c3\u30af &#8211; New &#8211; Package<\/ul>\n<blockquote><p>\u8fd9\u6b21\u7684\u5305\u540d\u88ab\u547d\u540d\u4e3aspringboot.oauth.sample\u3002<\/p><\/blockquote>\n<ul class=\"post-ul\">\u4f5c\u6210\u3057\u305f\u30d1\u30c3\u30b1\u30fc\u30b8\u53f3\u30af\u30ea\u30c3\u30af &#8211; New &#8211; Class &#8211; Main.java\u3092\u4f5c\u6210\u3059\u308b<\/ul>\n<pre class=\"post-pre\"><code><span class=\"kn\">package<\/span> <span class=\"nn\">springboot.oauth.sample<\/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\r\n<span class=\"nd\">@SpringBootApplication<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Main<\/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\">Main<\/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=\"o\">}<\/span>\r\n\r\n<\/code><\/pre>\n<h2>\u5e94\u7528\u7a0b\u5e8f\u8bbe\u7f6e<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">src\/main\/resources\/application.yml\u3092\u4f5c\u6210<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u4e8b\u524d\u306boauth server\u5074\u3067client\u3092\u4f5c\u6210<\/ul>\n<\/li>\n<\/ul>\n<p>\u4f5c\u6210\u6642\u306b\u53d6\u5f97\u3057\u305fclient-id\u3068client-secret\u3092\u8a2d\u5b9a<br \/>\noauth server\u5074\u306e\u8a8d\u8a3curl\u3082\u8a2d\u5b9a\u3059\u308b<\/p>\n<p>OAuth\u5074\u306e\u8a2d\u5b9a\u306f\u307b\u307c\u3053\u308c\u3060\u3051\u3067\u3042\u3068\u306f\u52dd\u624b\u306b\u8a8d\u8a3c\u51e6\u7406\u3057\u3066\u304f\u308c\u308b<\/p>\n<pre class=\"post-pre\"><code>server:\r\n  port: 8080\r\n  session-timeout: 1200\r\n\r\nspring:\r\n  main:  \r\n    show-banner: true\r\n\r\nsecurity:\r\n  basic:\r\n    enabled: false\r\n  oauth2:\r\n    client:\r\n      client-id: sampleapp\r\n      client-secret: wlpaBFBJTzmRLcLInQcIiS8ggLclLjQg\r\n      access-token-uri: http:\/\/localhost:9999\/api\/oauth2\/token\r\n      user-authorization-uri: http:\/\/localhost:9999\/api\/oauth2\/authorize\r\n      scope: admin,user\r\n      authorized-grant-types: authorization_code,refresh_token,client_credentials\r\n\r\n    resource:\r\n      user-info-uri: http:\/\/localhost:9999\/api\/profile\r\n      prefer-token-info: false\r\n\r\n    custom:\r\n      # for single sign out(global logout)\r\n      server-logout-url: http:\/\/localhost:9999\/logout\r\n\r\n      # redirect url for after single signed out\r\n      server-logouted-redirect-url: http:\/\/localhost:8080\/\r\n\r\n\r\n<\/code><\/pre>\n<h2>\u6625\u5b63\u5b89\u5168\u6027\u7684\u8bbe\u7f6e<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">src\/main\/java\/\/config\/SecurityConfig.java<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">spring security\u306e\u8a2d\u5b9a\u306b\u3066\u8a8d\u8a3c\u304c\u5fc5\u8981\u306aurl\u3092\u8a2d\u5b9a\u3059\u308b<\/ul>\n<\/li>\n<\/ul>\n<p>HttpSecurity\u306b\u30bb\u30c3\u30c8<\/p>\n<p>spring security\u306b\u8a8d\u8a3c\u3092OAuth\u30b5\u30fc\u30d0\u306b\u4efb\u305b\u308b\u3088\u3046@EnableOAuth2Sso\u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3\u3092\u3064\u3051\u308b<\/p>\n<pre class=\"post-pre\"><code><span class=\"kn\">package<\/span> <span class=\"nn\">springboot.oauth.sample.config<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.boot.autoconfigure.security.oauth2.client.EnableOAuth2Sso<\/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.builders.HttpSecurity<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.security.config.annotation.web.configuration.EnableWebSecurity<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.security.web.header.writers.frameoptions.XFrameOptionsHeaderWriter<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.security.web.header.writers.frameoptions.XFrameOptionsHeaderWriter.XFrameOptionsMode<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"nd\">@Configuration<\/span>\r\n<span class=\"nd\">@EnableWebSecurity<\/span>\r\n<span class=\"nd\">@EnableOAuth2Sso<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">SecurityConfig<\/span> <span class=\"kd\">extends<\/span> <span class=\"nc\">WebSecurityConfigurerAdapter<\/span> <span class=\"o\">{<\/span>\r\n\r\n  <span class=\"nd\">@Value<\/span><span class=\"o\">(<\/span><span class=\"s\">\"${security.oauth2.custom.server-logout-url}\"<\/span><span class=\"o\">)<\/span> <span class=\"kd\">private<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">serverLogoutUrl<\/span><span class=\"o\">;<\/span>\r\n\r\n  <span class=\"nd\">@Value<\/span><span class=\"o\">(<\/span><span class=\"s\">\"${security.oauth2.custom.server-logouted-redirect-url}\"<\/span><span class=\"o\">)<\/span> <span class=\"kd\">private<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">serverLogoutedRedirectUrl<\/span><span class=\"o\">;<\/span>\r\n\r\n  <span class=\"nd\">@Override<\/span>\r\n  <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">configure<\/span><span class=\"o\">(<\/span><span class=\"nc\">HttpSecurity<\/span> <span class=\"n\">http<\/span><span class=\"o\">)<\/span> <span class=\"kd\">throws<\/span> <span class=\"nc\">Exception<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"n\">http<\/span>\r\n      <span class=\"o\">.<\/span><span class=\"na\">headers<\/span><span class=\"o\">()<\/span>\r\n        <span class=\"c1\">\/\/ allow iframe<\/span>\r\n        <span class=\"o\">.<\/span><span class=\"na\">addHeaderWriter<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">XFrameOptionsHeaderWriter<\/span><span class=\"o\">(<\/span><span class=\"nc\">XFrameOptionsMode<\/span><span class=\"o\">.<\/span><span class=\"na\">SAMEORIGIN<\/span><span class=\"o\">))<\/span>\r\n      <span class=\"o\">.<\/span><span class=\"na\">and<\/span><span class=\"o\">()<\/span>\r\n      <span class=\"o\">.<\/span><span class=\"na\">authorizeRequests<\/span><span class=\"o\">()<\/span>\r\n      <span class=\"o\">.<\/span><span class=\"na\">antMatchers<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\/public\/**\"<\/span><span class=\"o\">).<\/span><span class=\"na\">permitAll<\/span><span class=\"o\">()<\/span>\r\n      <span class=\"o\">.<\/span><span class=\"na\">antMatchers<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\/\"<\/span><span class=\"o\">).<\/span><span class=\"na\">permitAll<\/span><span class=\"o\">()<\/span>\r\n      <span class=\"o\">.<\/span><span class=\"na\">antMatchers<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\/admin\/**\"<\/span><span class=\"o\">).<\/span><span class=\"na\">hasRole<\/span><span class=\"o\">(<\/span><span class=\"s\">\"ADMIN\"<\/span><span class=\"o\">)<\/span>\r\n      <span class=\"o\">.<\/span><span class=\"na\">anyRequest<\/span><span class=\"o\">().<\/span><span class=\"na\">authenticated<\/span><span class=\"o\">()<\/span>\r\n      <span class=\"o\">.<\/span><span class=\"na\">and<\/span><span class=\"o\">()<\/span>\r\n      <span class=\"o\">.<\/span><span class=\"na\">csrf<\/span><span class=\"o\">()<\/span>\r\n        <span class=\"o\">.<\/span><span class=\"na\">csrfTokenRepository<\/span><span class=\"o\">(<\/span><span class=\"n\">csrfTokenRepository<\/span><span class=\"o\">())<\/span>\r\n      <span class=\"o\">.<\/span><span class=\"na\">and<\/span><span class=\"o\">()<\/span>\r\n      <span class=\"o\">.<\/span><span class=\"na\">logout<\/span><span class=\"o\">()<\/span>\r\n        <span class=\"o\">.<\/span><span class=\"na\">logoutRequestMatcher<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">AntPathRequestMatcher<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\/logout\"<\/span><span class=\"o\">))<\/span>\r\n        <span class=\"o\">.<\/span><span class=\"na\">logoutSuccessUrl<\/span><span class=\"o\">(<\/span><span class=\"n\">serverLogoutUrl<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\"?next=\"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">serverLogoutedRedirectUrl<\/span><span class=\"o\">)<\/span>\r\n        <span class=\"o\">.<\/span><span class=\"na\">deleteCookies<\/span><span class=\"o\">(<\/span><span class=\"s\">\"JSESSIONID\"<\/span><span class=\"o\">)<\/span>\r\n        <span class=\"o\">.<\/span><span class=\"na\">invalidateHttpSession<\/span><span class=\"o\">(<\/span><span class=\"kc\">true<\/span><span class=\"o\">)<\/span>\r\n        <span class=\"o\">.<\/span><span class=\"na\">permitAll<\/span><span class=\"o\">()<\/span>\r\n    <span class=\"o\">;<\/span>\r\n  <span class=\"o\">}<\/span>\r\n\r\n  <span class=\"kd\">private<\/span> <span class=\"nc\">CsrfTokenRepository<\/span> <span class=\"nf\">csrfTokenRepository<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"nc\">HttpSessionCsrfTokenRepository<\/span> <span class=\"n\">repository<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">HttpSessionCsrfTokenRepository<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"n\">repository<\/span><span class=\"o\">.<\/span><span class=\"na\">setHeaderName<\/span><span class=\"o\">(<\/span><span class=\"s\">\"X-XSRF-TOKEN\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"n\">repository<\/span><span class=\"o\">;<\/span>\r\n  <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n\r\n<\/code><\/pre>\n<h2>\u521b\u5efa\u63a7\u5236\u5668<\/h2>\n<p>\u8a8d\u8a3c\u304c\u5fc5\u8981\u306aURL\u3092\u4f5c\u6210<\/p>\n<p>\u5b9f\u969b\u306fSecurityConfig.java\u306e\u8a2d\u5b9a\u3067\u8a8d\u8a3c\u3092\u5fc5\u8981\u3068\u3059\u308bURL<br \/>\n\u4eca\u56de\u306f\/protected\u3068\u3057\u305f<\/p>\n<p>\u30a2\u30af\u30bb\u30b9\u6642\u3001OAuth\u30b5\u30fc\u30d0\u3078\u81ea\u52d5\u7684\u306b\u8a8d\u8a3c\u3057\u306b\u3044\u304d\u3001\u3055\u3089\u306b\u8a8d\u8a3cOK\u5f8c\u3001accessToken\u3092\u53d6\u5f97\u3001profile\u3092\u53d6\u5f97\u3059\u308b\u3068\u3053\u308d\u307e\u3067\u5168\u81ea\u52d5<br \/>\n\u8a8d\u8a3cOK\u3067controller\u306b\u5165\u3063\u3066\u304f\u308b\u306e\u3067\u8a8d\u8a3c\u60c5\u5831\u3092OAuth2Authentication\u3067\u53d6\u5f97\u3067\u304d\u308b<\/p>\n<pre class=\"post-pre\"><code>\r\n<span class=\"kn\">package<\/span> <span class=\"nn\">springboot.oauth.sample.controller<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.security.core.Authentication<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.security.oauth2.provider.OAuth2Authentication<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.web.bind.annotation.RequestMapping<\/span><span class=\"o\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">org.springframework.web.bind.annotation.RequestMethod<\/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\">@RestController<\/span>\r\n<span class=\"nd\">@RequestMapping<\/span><span class=\"o\">(<\/span><span class=\"n\">value<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"\/protected\"<\/span><span class=\"o\">)<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">ProtectedController<\/span> <span class=\"kd\">extends<\/span> <span class=\"nc\">BaseController<\/span> <span class=\"o\">{<\/span>\r\n\r\n  <span class=\"nd\">@RequestMapping<\/span><span class=\"o\">(<\/span><span class=\"n\">value<\/span> <span class=\"o\">=<\/span> <span class=\"o\">{<\/span><span class=\"s\">\"\"<\/span><span class=\"o\">,<\/span> <span class=\"s\">\"\/\"<\/span><span class=\"o\">},<\/span> <span class=\"n\">method<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">RequestMethod<\/span><span class=\"o\">.<\/span><span class=\"na\">GET<\/span><span class=\"o\">)<\/span>\r\n  <span class=\"kd\">public<\/span> <span class=\"nc\">Authentication<\/span> <span class=\"nf\">index<\/span><span class=\"o\">(<\/span><span class=\"nc\">OAuth2Authentication<\/span> <span class=\"n\">authentication<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"n\">authentication<\/span><span class=\"o\">;<\/span>\r\n  <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n\r\n<\/code><\/pre>\n<h1>\u6211\u8981\u8a66\u8a66\u770b<\/h1>\n<h2>\u767b\u9646<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u30d6\u30e9\u30a6\u30b6\u304b\u3089localhost:8080\/protected\u306b\u30a2\u30af\u30bb\u30b9<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u81ea\u52d5\u7684\u306bOAuth\u30b5\u30fc\u30d0\u306e\u8a8d\u8a3c\u30da\u30fc\u30b8\u306b\u9077\u79fb\u3059\u308b<\/ul>\n<div><img decoding=\"async\" class=\"post-images\" title=\"Kobito.Q01sVF.png\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d3d6937434c4406c87c0c\/34-0.png\" alt=\"Kobito.Q01sVF.png\" \/><\/div>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u8a8d\u8a3cOK\u3059\u308b\u3068\u4ee5\u4e0b\u306e\u3053\u3068\u3092Spring Security\u304c\u81ea\u52d5\u7684\u306b\u3057\u3066\u304f\u308c\u308b<\/ul>\n<\/li>\n<\/ul>\n<p>\/login\u3068\u3044\u3046URL\u3092\u4f7f\u3044OAuth code\u3092\u53d6\u5f97<br \/>\ncode\u3092\u4f7f\u3063\u3066OAuth\u30b5\u30fc\u30d0\u306b\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u6295\u3052\u3001access_token\u3092\u53d6\u5f97<br \/>\naccess_token\u3092\u4f7f\u3063\u3066OAuth\u30b5\u30fc\u30d0\u306eprofile api\u306b\u30a2\u30af\u30bb\u30b9\u3057\u3066profile\u3092\u53d6\u5f97<br \/>\n\u3082\u3068\u3082\u3068\u30ea\u30af\u30a8\u30b9\u30c8\u3055\u308c\u305fURL\u306b\u9077\u79fb<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"Kobito.1bghvM.png\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d3d6937434c4406c87c0c\/36-0.png\" alt=\"Kobito.1bghvM.png\" \/><\/div>\n<h2>\u9000\u51fa\u767b\u5f55<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u30d6\u30e9\u30a6\u30b6\u304b\u3089localhost:8080\/logout\u306b\u30a2\u30af\u30bb\u30b9<\/ul>\n<\/li>\n<\/ul>\n<p>\/logout\u306fSecurityConfig\u3067\u6307\u5b9a\u3057\u305fURL\u3067\u3001spring security\u304c\u81ea\u52d5\u7684\u306burl\u3092\u30de\u30c3\u30d4\u30f3\u30b0\u3057\u3066\u304f\u308c\u308b<\/p>\n<p>\u30ed\u30b0\u30a2\u30a6\u30c8\u5f8c\u3001OAuth\u30b5\u30fc\u30d0\u306e\u30ed\u30b0\u30a2\u30a6\u30c8URL\u306b\u98db\u3070\u3057\u3066\u3044\u308b\u306e\u3067OAuth\u30b5\u30fc\u30d0\u5074\u3082\u30ed\u30b0\u30a2\u30a6\u30c8\u3055\u308c\u308b<\/p>\n<p>\u3053\u306e\u8fba\u306f\u7121\u7406\u3084\u308a\u3060\u3051\u308c\u3069global logout\u3063\u3066\u304d\u3063\u3068\u3053\u3046\u3044\u3046\u3053\u3068\u306a\u3093\u3060\u308d\u3046\u3068\u52dd\u624b\u306b\u89e3\u91c8<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u9996\u5148 \u4f7f\u7528\u7684\u7269\u54c1 de Eclipse &nbsp; Gradle &nbsp; \u8a8d\u8a3c\u30b5\u30fc\u30d0\u3053\u3053\u3067\u4f5c\u6210\u3057\u305f\u3082\u306e [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-39940","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\u7528SpringBoot\u548cSpring Security OAuth2\u6765\u81ea\u5b9a\u4e49OAuth\u670d\u52a1\u5668\u5e76\u8fdb\u884c\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\u7528springboot\u548cspring-security-oauth2\u6765\u81ea\u5b9a\u4e49oauth\u670d\u52a1\u5668\u5e76\u8fdb\u884c\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\u7528SpringBoot\u548cSpring Security OAuth2\u6765\u81ea\u5b9a\u4e49OAuth\u670d\u52a1\u5668\u5e76\u8fdb\u884c\u8ba4\u8bc1\" \/>\n<meta property=\"og:description\" content=\"\u9996\u5148 \u4f7f\u7528\u7684\u7269\u54c1 de Eclipse &nbsp; Gradle &nbsp; \u8a8d\u8a3c\u30b5\u30fc\u30d0\u3053\u3053\u3067\u4f5c\u6210\u3057\u305f\u3082\u306e [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528springboot\u548cspring-security-oauth2\u6765\u81ea\u5b9a\u4e49oauth\u670d\u52a1\u5668\u5e76\u8fdb\u884c\u8ba4\u8bc1\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-07-25T06:20:43+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-05-03T16:38:25+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d3d6937434c4406c87c0c\/8-0.png\" \/>\n<meta name=\"author\" content=\"\u79d1, \u96c5\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u79d1, \u96c5\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 \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%a8springboot%e5%92%8cspring-security-oauth2%e6%9d%a5%e8%87%aa%e5%ae%9a%e4%b9%89oauth%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%b9%b6%e8%bf%9b%e8%a1%8c%e8%ae%a4%e8%af%81%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot%e5%92%8cspring-security-oauth2%e6%9d%a5%e8%87%aa%e5%ae%9a%e4%b9%89oauth%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%b9%b6%e8%bf%9b%e8%a1%8c%e8%ae%a4%e8%af%81%e3%80%82\/\",\"name\":\"\u4f7f\u7528SpringBoot\u548cSpring Security OAuth2\u6765\u81ea\u5b9a\u4e49OAuth\u670d\u52a1\u5668\u5e76\u8fdb\u884c\u8ba4\u8bc1 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-07-25T06:20:43+00:00\",\"dateModified\":\"2024-05-03T16:38:25+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot%e5%92%8cspring-security-oauth2%e6%9d%a5%e8%87%aa%e5%ae%9a%e4%b9%89oauth%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%b9%b6%e8%bf%9b%e8%a1%8c%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%a8springboot%e5%92%8cspring-security-oauth2%e6%9d%a5%e8%87%aa%e5%ae%9a%e4%b9%89oauth%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%b9%b6%e8%bf%9b%e8%a1%8c%e8%ae%a4%e8%af%81%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot%e5%92%8cspring-security-oauth2%e6%9d%a5%e8%87%aa%e5%ae%9a%e4%b9%89oauth%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%b9%b6%e8%bf%9b%e8%a1%8c%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\u7528SpringBoot\u548cSpring Security OAuth2\u6765\u81ea\u5b9a\u4e49OAuth\u670d\u52a1\u5668\u5e76\u8fdb\u884c\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\/41e222757cdd2a3365361328bd79970a\",\"name\":\"\u79d1, \u96c5\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g\",\"caption\":\"\u79d1, \u96c5\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/keya\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot%e5%92%8cspring-security-oauth2%e6%9d%a5%e8%87%aa%e5%ae%9a%e4%b9%89oauth%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%b9%b6%e8%bf%9b%e8%a1%8c%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\u7528SpringBoot\u548cSpring Security OAuth2\u6765\u81ea\u5b9a\u4e49OAuth\u670d\u52a1\u5668\u5e76\u8fdb\u884c\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\u7528springboot\u548cspring-security-oauth2\u6765\u81ea\u5b9a\u4e49oauth\u670d\u52a1\u5668\u5e76\u8fdb\u884c\u8ba4\u8bc1\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"\u4f7f\u7528SpringBoot\u548cSpring Security OAuth2\u6765\u81ea\u5b9a\u4e49OAuth\u670d\u52a1\u5668\u5e76\u8fdb\u884c\u8ba4\u8bc1","og_description":"\u9996\u5148 \u4f7f\u7528\u7684\u7269\u54c1 de Eclipse &nbsp; Gradle &nbsp; \u8a8d\u8a3c\u30b5\u30fc\u30d0\u3053\u3053\u3067\u4f5c\u6210\u3057\u305f\u3082\u306e [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528springboot\u548cspring-security-oauth2\u6765\u81ea\u5b9a\u4e49oauth\u670d\u52a1\u5668\u5e76\u8fdb\u884c\u8ba4\u8bc1\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-07-25T06:20:43+00:00","article_modified_time":"2024-05-03T16:38:25+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d3d6937434c4406c87c0c\/8-0.png"}],"author":"\u79d1, \u96c5","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u79d1, \u96c5","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"3 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot%e5%92%8cspring-security-oauth2%e6%9d%a5%e8%87%aa%e5%ae%9a%e4%b9%89oauth%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%b9%b6%e8%bf%9b%e8%a1%8c%e8%ae%a4%e8%af%81%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot%e5%92%8cspring-security-oauth2%e6%9d%a5%e8%87%aa%e5%ae%9a%e4%b9%89oauth%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%b9%b6%e8%bf%9b%e8%a1%8c%e8%ae%a4%e8%af%81%e3%80%82\/","name":"\u4f7f\u7528SpringBoot\u548cSpring Security OAuth2\u6765\u81ea\u5b9a\u4e49OAuth\u670d\u52a1\u5668\u5e76\u8fdb\u884c\u8ba4\u8bc1 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-07-25T06:20:43+00:00","dateModified":"2024-05-03T16:38:25+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot%e5%92%8cspring-security-oauth2%e6%9d%a5%e8%87%aa%e5%ae%9a%e4%b9%89oauth%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%b9%b6%e8%bf%9b%e8%a1%8c%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%a8springboot%e5%92%8cspring-security-oauth2%e6%9d%a5%e8%87%aa%e5%ae%9a%e4%b9%89oauth%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%b9%b6%e8%bf%9b%e8%a1%8c%e8%ae%a4%e8%af%81%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot%e5%92%8cspring-security-oauth2%e6%9d%a5%e8%87%aa%e5%ae%9a%e4%b9%89oauth%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%b9%b6%e8%bf%9b%e8%a1%8c%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\u7528SpringBoot\u548cSpring Security OAuth2\u6765\u81ea\u5b9a\u4e49OAuth\u670d\u52a1\u5668\u5e76\u8fdb\u884c\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\/41e222757cdd2a3365361328bd79970a","name":"\u79d1, \u96c5","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g","caption":"\u79d1, \u96c5"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/keya\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8springboot%e5%92%8cspring-security-oauth2%e6%9d%a5%e8%87%aa%e5%ae%9a%e4%b9%89oauth%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%b9%b6%e8%bf%9b%e8%a1%8c%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\/39940","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\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=39940"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/39940\/revisions"}],"predecessor-version":[{"id":95063,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/39940\/revisions\/95063"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=39940"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=39940"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=39940"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}