{"id":46859,"date":"2025-07-30T04:27:00","date_gmt":"2025-07-29T20:27:00","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/46859.html"},"modified":"2025-07-30T04:27:00","modified_gmt":"2025-07-29T20:27:00","slug":"spring-security-oauth2%e7%b3%bb%e5%88%97%ef%bc%9a%e8%87%aa%e5%ae%9a%e4%b9%89%e8%ae%a4%e8%af%81%e6%9c%8d%e5%8a%a1%e5%99%a8","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/46859.html","title":{"rendered":"spring-security-oauth2\u7cfb\u5217\uff1a\u81ea\u5b9a\u4e49\u8ba4\u8bc1\u670d\u52a1\u5668"},"content":{"rendered":"<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u76ee\u5f55<\/p>\n<p id=\"%E7%AE%80%E5%8D%95%E7%A4%BA%E4%BE%8B-toc\" style=\"margin-left:0px\">\u7b80\u5355\u793a\u4f8b<\/p>\n<p id=\"%E8%87%AA%E5%AE%9A%E4%B9%89clientDetailsService-toc\" style=\"margin-left:0px\">\u81ea\u5b9a\u4e49clientDetailsService<\/p>\n<p id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8BClientDetailServiceImpl-toc\" style=\"margin-left:40px\">ClientDetailServiceImpl<\/p>\n<p id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E7%A8%8B%E5%BA%8F%E6%B5%81%E7%A8%8B-toc\" style=\"margin-left:40px\">\u7a0b\u5e8f\u6d41\u7a0b<\/p>\n<p id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8BEndpoint-toc\" style=\"margin-left:80px\">\u200b\u200b\u200b\u200b\u200b\u200b\u200bEndpoint<\/p>\n<p id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8BEnableAuthorizationServer-toc\" style=\"margin-left:80px\">\u200b\u200b\u200b\u200b\u200b\u200b\u200bEnableAuthorizationServer<\/p>\n<p id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8BAuthorizationServerSecurityConfiguration-toc\" style=\"margin-left:80px\">\u200b\u200b\u200b\u200b\u200b\u200b\u200bAuthorizationServerSecurityConfiguration<\/p>\n<p id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8BClientDetailsServiceConfiguration-toc\" style=\"margin-left:80px\">\u200b\u200b\u200b\u200b\u200b\u200b\u200bClientDetailsServiceConfiguration<\/p>\n<p id=\"%E8%87%AA%E5%AE%9A%E4%B9%89authorizationCodeServices-toc\" style=\"margin-left:0px\">\u81ea\u5b9a\u4e49authorizationCodeServices<\/p>\n<p id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8BRedisAuthenticationCodeServices-toc\" style=\"margin-left:40px\">\u200b\u200b\u200b\u200b\u200b\u200b\u200bRedisAuthenticationCodeServices<\/p>\n<p id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E7%A8%8B%E5%BA%8F%E6%B5%81%E7%A8%8B-toc\" style=\"margin-left:40px\">\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u7a0b\u5e8f\u6d41\u7a0b<\/p>\n<p id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8BAuthorizationServerEndpointsConfiguration-toc\" style=\"margin-left:80px\">\u200b\u200b\u200b\u200b\u200b\u200b\u200bAuthorizationServerEndpointsConfiguration<\/p>\n<p id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8BauthorizationCodeServices-toc\" style=\"margin-left:80px\">\u200b\u200b\u200b\u200b\u200b\u200b\u200bauthorizationCodeServices<\/p>\n<p id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8BgetEndpointsConfigurer-toc\" style=\"margin-left:80px\">\u200b\u200b\u200b\u200b\u200b\u200b\u200bgetEndpointsConfigurer<\/p>\n<p id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8BAuthorizationEndpoint-toc\" style=\"margin-left:80px\">\u200b\u200b\u200b\u200b\u200b\u200b\u200bAuthorizationEndpoint<\/p>\n<p id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8BgetAuthorizationCodeResponse-toc\" style=\"margin-left:80px\">\u200b\u200b\u200b\u200b\u200b\u200b\u200bgetAuthorizationCodeResponse<\/p>\n<p id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8BgenerateCode-toc\" style=\"margin-left:80px\">\u200b\u200b\u200b\u200b\u200b\u200b\u200bgenerateCode<\/p>\n<p id=\"%E8%87%AA%E5%AE%9A%E4%B9%89tokenServices-toc\" style=\"margin-left:0px\">\u81ea\u5b9a\u4e49tokenServices<\/p>\n<p id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8BDefaultTokenServices-toc\" style=\"margin-left:40px\">\u200b\u200b\u200b\u200b\u200b\u200b\u200bDefaultTokenServices<\/p>\n<p id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8BgetTokenStore-toc\" style=\"margin-left:40px\">\u200b\u200b\u200b\u200b\u200b\u200b\u200bgetTokenStore<\/p>\n<p id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8BRedisTokenStore-toc\" style=\"margin-left:40px\">\u200b\u200b\u200b\u200b\u200b\u200b\u200bRedisTokenStore<\/p>\n<p id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E7%A8%8B%E5%BA%8F%E6%B5%81%E7%A8%8B-toc\" style=\"margin-left:40px\">\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u7a0b\u5e8f\u6d41\u7a0b<\/p>\n<p id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8BpostAccessToken-toc\" style=\"margin-left:80px\">\u200b\u200b\u200b\u200b\u200b\u200b\u200bpostAccessToken<\/p>\n<p id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8Bgrant-toc\" style=\"margin-left:80px\">\u200b\u200b\u200b\u200b\u200b\u200b\u200bgrant<\/p>\n<p id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8BgetAccessToken-toc\" style=\"margin-left:80px\">\u200b\u200b\u200b\u200b\u200b\u200b\u200bgetAccessToken<\/p>\n<p id=\"%E6%80%BB%E7%BB%93-toc\" style=\"margin-left:0px\">\u603b\u7ed3<\/p>\n<hr id=\"hr-toc\" \/>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0 \u00a0 \u00a0<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0 \u00a0 \u00a0 \u00a0\u672c\u7bc7\u6587\u7ae0\u6211\u4eec\u6765\u7814\u7a76spring-security\u6846\u67b6\u91cc\u5982\u4f55\u81ea\u5b9a\u4e49clientDetailsService, authorizationCodeServices\u548ctokenServices\u3002<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0 \u00a0 \u00a0 \u00a0\u53ea\u8981\u4f7f\u7528\u4e86spring-security\u6846\u67b6&#xff0c;\u90a3\u4e48&#xff0c;\u5f00\u53d1\u4eba\u5458\u5c31\u514d\u4e0d\u4e86\u8981\u5bf9\u8fd9\u4e9b\u670d\u52a1\u8fdb\u884c\u81ea\u5b9a\u4e49\u3002<\/p>\n<h2 id=\"%E7%AE%80%E5%8D%95%E7%A4%BA%E4%BE%8B\" style=\"text-align:justify\">\u7b80\u5355\u793a\u4f8b<\/h2>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0 \u00a0 \u00a0 \u00a0\u9996\u5148&#xff0c;\u65b0\u5efa\u4e00\u4e2aconfig\u5305\u7528\u4e8e\u5b58\u653espring-security\u901a\u7528\u914d\u7f6e&#xff1b;\u7136\u540e&#xff0c;\u65b0\u5efa\u4e00\u4e2aWebSecurityConfig\u7c7b&#xff0c;\u4f7f\u5176\u7ee7\u627fWebSecurityConfigurerAdapter\u3002<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0 \u00a0 \u00a0 \u00a0\u7136\u540e&#xff0c;\u7ed9WebSecutiryConfig\u7c7b\u4e2d\u52a0\u4e0a&#064;EnableWebSecurity \u6ce8\u89e3\u540e&#xff0c;\u8fd9\u6837\u4fbf\u4f1a\u81ea\u52a8\u88ab Spring\u53d1\u73b0\u5e76\u6ce8\u518c\u3002<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0 \u00a0 \u00a0 \u00a0\u5982\u4e0b\u6240\u793a&#xff1a;<\/p>\n<table border=\"1\" cellspacing=\"0\">\n<tbody>\n<tr>\n<td style=\"vertical-align:top;width:426.1000pt\">\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">&#064;EnableAuthorizationServer<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">public class OAuth2ServerConfig extends AuthorizationServerConfigurerAdapter {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">&#8230; &#8230;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">&#064;Autowired<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">private JedisConnectionFactory jedisConnectionFactory;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">&#064;Autowired<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">private RedisAuthenticationCodeServices redisAuthorizationCodeServices;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">&#064;Override<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">public void configure(AuthorizationServerEndpointsConfigurer endpoints) {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">&#8230; &#8230;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">endpoints.authorizationCodeServices(redisAuthorizationCodeServices);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">DefaultTokenServices tokenServices &#061; new DefaultTokenServices();<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">tokenServices.setSupportRefreshToken(true);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">tokenServices.setTokenStore(getTokenStore());<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">tokenServices.setAccessTokenValiditySeconds((int)TimeUnit.DAYS.toSeconds(180)); tokenServices.setRefreshTokenValiditySeconds((int)TimeUnit.DAYS.toSeconds(360));<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">tokenServices.setReuseRefreshToken(false);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">endpoints.tokenServices(tokenServices);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">}<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">&#064;Bean<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">TokenStore getTokenStore() {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">return new RedisTokenStore(jedisConnectionFactory);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">}<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0&#064;Bean<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">public ClientDetailServiceImpl getClientDetails() {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">return new ClientDetailServiceImpl();<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">}<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">&#064;Override<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">public void configure(ClientDetailsServiceConfigurer clients) throws Exception {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\/\/ \u914d\u7f6e\u5ba2\u6237\u7aef, \u7528\u4e8eclient\u8ba4\u8bc1<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">clients.withClientDetails(getClientDetails());<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">}<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">\u00a0 \u00a0 \u00a0 \u00a0\u5728\u8fd9\u91cc&#xff1a;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0 \u00a0 \u00a0 \u00a0\u901a\u8fc7clients.withClientDetails(getClientDetails())\u8fdb\u884c\u81ea\u5b9a\u4e49\u670d\u52a1clientDetailsService&#xff1b;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0 \u00a0 \u00a0 \u00a0\u901a\u8fc7endpoints.authorizationCodeServices(redisAuthorizationCodeServices)\u8fdb\u884c\u81ea\u5b9a\u4e49\u670d\u52a1authorizationCodeServices&#xff1b;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0 \u00a0 \u00a0 \u00a0\u901a\u8fc7endpoints.tokenServices(tokenServices)\u8fdb\u884c\u81ea\u5b9a\u4e49\u670d\u52a1tokenServices\u3002<\/p>\n<h2 id=\"%E8%87%AA%E5%AE%9A%E4%B9%89clientDetailsService\" style=\"text-align:justify\">\u81ea\u5b9a\u4e49clientDetailsService<\/h2>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">\u00a0 \u00a0 \u00a0 \u00a0 \u70b9\u51fb\u7b80\u5355\u793a\u4f8b\u91cc\u7684ClientDetailServiceImpl()\u65b9\u6cd5&#xff0c;\u5982\u4e0b\u6240\u793a&#xff1a;<\/p>\n<h3 id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8BClientDetailServiceImpl\">\u200b\u200b\u200b\u200b\u200b\u200b\u200bClientDetailServiceImpl <\/h3>\n<table border=\"1\" cellspacing=\"0\">\n<tbody>\n<tr>\n<td style=\"vertical-align:top;width:426.1000pt\">\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">package com.example.author.service.impl;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">&#8230; &#8230;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">public class ClientDetailServiceImpl implements ClientDetailsService {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0&#064;Override<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0public ClientDetails loadClientByClientId(String clientId) throws ClientRegistrationException {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0SysOauthClient sysOauthClient &#061; selectByClientId(clientId);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (sysOauthClient !&#061; null) {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0String clientSecret &#061; sysOauthClient.getClientSecret();<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0String redirectUrl &#061; sysOauthClient.getRedirectUrl();<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0BaseClientDetails client &#061; new BaseClientDetails();<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0client.setClientId(clientId);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0client.setClientSecret(clientSecret);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0client.setRegisteredRedirectUri(new HashSet&lt;String&gt;() {{<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0add(redirectUrl);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}});<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0client.setAuthorizedGrantTypes(new HashSet&lt;String&gt;() {{<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0add(&#034;authorization_code&#034;);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0add(&#034;refresh_token&#034;);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0add(&#034;client_credentials&#034;);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0add(&#034;password&#034;);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0add(&#034;implicit&#034;);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}});<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0client.setScope(new HashSet&lt;String&gt;() {{<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0add(&#034;all&#034;);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}});<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return client;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} else {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0throw new NoSuchClientException(&#034;No client with requested id: &#034; &#043; clientId);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0}<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">}<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">\u00a0 \u00a0 \u00a0 \u00a0\u5728\u8fd9\u91cc&#xff0c;\u901a\u8fc7\u5b9e\u73b0\u6846\u67b6\u63d0\u4f9b\u7684\u63a5\u53e3ClientDetailsService\u5e76\u91cd\u5199loadClientByClientId()\u65b9\u6cd5\u7684\u65b9\u5f0f\u6765\u5b9e\u73b0\u81ea\u5b9a\u4e49clientDetailsService\u7684\u529f\u80fd\u3002<\/p>\n<h3 id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E7%A8%8B%E5%BA%8F%E6%B5%81%E7%A8%8B\">\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u7a0b\u5e8f\u6d41\u7a0b<\/h3>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0 \u00a0 \u00a0 \u00a0 \u901a\u8fc7\u524d\u9762\u7684\u6587\u7ae0&#xff0c;\u6211\u4eec\u77e5\u9053\/oauth\/authorize\u548c\/oauth\/token\u4e24\u4e2a\u7aef\u70b9\u90fd\u6709\u4f9d\u8d56\u670d\u52a1clientDetailServices&#xff0c;\u5982\u4e0b\u6240\u793a&#xff1a;<\/p>\n<h4 id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8BEndpoint\">\u200b\u200b\u200b\u200b\u200b\u200b\u200bEndpoint<\/h4>\n<table border=\"1\" cellspacing=\"0\">\n<tbody>\n<tr>\n<td style=\"vertical-align:top;width:426.1000pt\">\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">&#064;Bean<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">public AuthorizationEndpoint authorizationEndpoint() throws Exception {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">AuthorizationEndpoint authorizationEndpoint &#061; new AuthorizationEndpoint();<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">&#8230; &#8230;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">authorizationEndpoint.setClientDetailsService(clientDetailsService);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">&#8230; &#8230;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">return authorizationEndpoint;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">}<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">&#064;Bean<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">public TokenEndpoint tokenEndpoint() throws Exception {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">TokenEndpoint tokenEndpoint &#061; new TokenEndpoint();<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">tokenEndpoint.setClientDetailsService(clientDetailsService);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">&#8230; &#8230;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">return tokenEndpoint;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">}<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0 \u00a0 \u00a0 \u00a0 \u5728\u8fd9\u91cc&#xff0c;\u76f4\u63a5\u5c06clientDetailServices\u8d4b\u503c\u7ed9\u4e24\u4e2a\u7aef\u70b9\u5b9e\u4f8bauthorizationEndpoint\u548ctokenEndpoint\u3002<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0 \u00a0 \u00a0 \u00a0\u63a5\u4e0b\u6765&#xff0c;\u6211\u4eec\u63a2\u7a76\u4e00\u4e0bClientDetailsServiceConfigurer.withClientDetails()\u662f\u5982\u4f55\u5b9e\u4f8b\u5316clientDetailsService\u5bf9\u8c61\u7684&#xff1f;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0 \u00a0 \u00a0 \u00a0\u70b9\u51fb\u7b80\u5355\u793a\u4f8b\u91cc\u7684EnableAuthorizationServer&#xff0c;\u5982\u4e0b\u6240\u793a&#xff1a;<\/p>\n<h4 id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8BEnableAuthorizationServer\">\u200b\u200b\u200b\u200b\u200b\u200b\u200bEnableAuthorizationServer<\/h4>\n<table border=\"1\" cellspacing=\"0\">\n<tbody>\n<tr>\n<td style=\"vertical-align:top;width:426.1000pt\">\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">&#064;Import({AuthorizationServerEndpointsConfiguration.class, AuthorizationServerSecurityConfiguration.class})<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">public &#064;interface EnableAuthorizationServer {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">}<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">\u00a0 \u00a0 \u00a0 \u00a0 \u70b9\u51fbAuthorizationServerSecurityConfiguration\u7c7b&#xff0c;\u5982\u4e0b\u6240\u793a&#xff1a;<\/p>\n<h4 id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8BAuthorizationServerSecurityConfiguration\">\u200b\u200b\u200b\u200b\u200b\u200b\u200bAuthorizationServerSecurityConfiguration<\/h4>\n<table border=\"1\" cellspacing=\"0\">\n<tbody>\n<tr>\n<td style=\"vertical-align:top;width:426.1000pt\">\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">&#064;Import({ ClientDetailsServiceConfiguration.class, AuthorizationServerEndpointsConfiguration.class })<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">public class AuthorizationServerSecurityConfiguration extends WebSecurityConfigurerAdapter {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0&#8230; &#8230;<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">\u00a0 \u00a0 \u00a0 \u00a0 \u70b9\u51fbClientDetailsServiceConfiguration\u7c7b&#xff0c;\u5982\u4e0b\u6240\u793a&#xff1a;<\/p>\n<h4 id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8BClientDetailsServiceConfiguration\">\u200b\u200b\u200b\u200b\u200b\u200b\u200bClientDetailsServiceConfiguration<\/h4>\n<table border=\"1\" cellspacing=\"0\">\n<tbody>\n<tr>\n<td style=\"vertical-align:top;width:426.1000pt\">\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">&#064;Configuration<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">public class ClientDetailsServiceConfiguration {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">private ClientDetailsServiceConfigurer configurer &#061; new ClientDetailsServiceConfigurer(new ClientDetailsServiceBuilder());<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">&#064;Bean<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">public ClientDetailsServiceConfigurer clientDetailsServiceConfigurer() {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">return configurer;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">}<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">&#064;Bean<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">&#064;Lazy<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">&#064;Scope(proxyMode&#061;ScopedProxyMode.INTERFACES)<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">public ClientDetailsService clientDetailsService() throws Exception {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">return configurer.and().build();<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">}<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">}<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">\u00a0 \u00a0 \u00a0 \u5728\u8fd9\u91cc&#xff0c;\u6211\u4eec\u770b\u5230\u4e86Bean\u5bf9\u8c61clientDetailsService\u7684\u5b9a\u4e49\u4e86&#xff0c;\u800c\u4e14\u4e5f\u77e5\u9053\u662f\u901a\u8fc7configurer.and().build()\u7684\u65b9\u5f0f\u6765\u5b9e\u4f8b\u5316clientDetailsService\u5bf9\u8c61\u3002\u5177\u4f53configurer.and().build()\u662f\u5982\u4f55\u5b9e\u4f8b\u5316\u7684\u5462&#xff1f;\u8fd9\u91cc\u6d89\u53ca\u7684\u5185\u5bb9\u4e5f\u4e0d\u5c11&#xff0c;\u7559\u7740\u540e\u7eed\u518d\u63a2\u7a76\u3002<\/p>\n<h2 id=\"%E8%87%AA%E5%AE%9A%E4%B9%89authorizationCodeServices\" style=\"text-align:justify\">\u81ea\u5b9a\u4e49authorizationCodeServices<\/h2>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">\u00a0 \u00a0 \u00a0 \u00a0 \u70b9\u51fb\u7b80\u5355\u793a\u4f8b\u91cc\u7684RedisAuthenticationCodeServices\u7c7b&#xff0c;\u5982\u4e0b\u6240\u793a&#xff1a;<\/p>\n<h3 id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8BRedisAuthenticationCodeServices\">\u200b\u200b\u200b\u200b\u200b\u200b\u200bRedisAuthenticationCodeServices<\/h3>\n<table border=\"1\" cellspacing=\"0\">\n<tbody>\n<tr>\n<td style=\"vertical-align:top;width:426.1000pt\">\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">package com.example.author.service;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">&#064;Service<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">public class RedisAuthenticationCodeServices extends RandomValueAuthorizationCodeServices {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0&#8230; &#8230;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0&#064;Resource<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0private RedisTemplate redisTemplate;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0&#064;Override<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0protected OAuth2Authentication remove(final String code) {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0OAuth2Authentication oAuth2Authentication &#061; (OAuth2Authentication) redisTemplate.execute(new RedisCallback&lt;OAuth2Authentication&gt;() {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#064;Override<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0public OAuth2Authentication doInRedis(RedisConnection connection) throws DataAccessException {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0byte[] keyByte &#061; codeKey(code).getBytes();<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0byte[] valueByte &#061; connection.get(keyByte);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (valueByte !&#061; null) {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0connection.del(keyByte);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return (OAuth2Authentication)SerializationUtils.deserialize(valueByte);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return null;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0});<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return oAuth2Authentication;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0}<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0&#064;Override<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0protected void store(String code, OAuth2Authentication authentication) {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0try {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0redisTemplate.execute(new RedisCallback&lt;Long&gt;() {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#064;Override<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0public Long doInRedis(RedisConnection connection) throws DataAccessException {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0connection.set(codeKey(code).getBytes(), SerializationUtils.serialize(authentication),\u00a0Expiration.from(5, TimeUnit.MINUTES), RedisStringCommands.SetOption.UPSERT);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return 1L;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0});<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} catch (Exception e) {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0log.error(&#034;\u4fdd\u5b58authentication code \u5931\u8d25&#034;, e);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0}<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">}<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">\u00a0 \u00a0 \u00a0 \u00a0\u5728\u8fd9\u91cc&#xff0c;\u901a\u8fc7\u7ee7\u627f\u7c7bRandomValueAuthorizationCodeServices\u5e76\u91cd\u5199remove()\u548cstore()\u65b9\u6cd5\u6765\u5b9e\u73b0\u81ea\u5b9a\u4e49authorizationCodeServices\u7684\u529f\u80fd\u3002<\/p>\n<h3 id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E7%A8%8B%E5%BA%8F%E6%B5%81%E7%A8%8B\">\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u7a0b\u5e8f\u6d41\u7a0b<\/h3>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">\u00a0 \u00a0 \u00a0 \u00a0\u901a\u8fc7\u524d\u9762\u7684\u6587\u7ae0&#xff0c;\u6211\u4eec\u77e5\u9053\/oauth\/authorize\u7aef\u70b9\u6709\u4f9d\u8d56\u670d\u52a1authorizationCodeServices&#xff0c;\u5982\u4e0b\u6240\u793a&#xff1a;<\/p>\n<h4 id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8BAuthorizationServerEndpointsConfiguration\">\u200b\u200b\u200b\u200b\u200b\u200b\u200bAuthorizationServerEndpointsConfiguration <\/h4>\n<table border=\"1\" cellspacing=\"0\">\n<tbody>\n<tr>\n<td style=\"vertical-align:top;width:426.1000pt\">\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">&#064;Import(TokenKeyEndpointRegistrar.class)<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">public class AuthorizationServerEndpointsConfiguration {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0&#8230; &#8230;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">&#064;Bean<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">public AuthorizationEndpoint authorizationEndpoint() throws Exception {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">AuthorizationEndpoint authorizationEndpoint &#061; new AuthorizationEndpoint();<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">&#8230; &#8230;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">authorizationEndpoint.setAuthorizationCodeServices(authorizationCodeServices());<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">&#8230; &#8230;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">return authorizationEndpoint;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">}<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">\u00a0 \u00a0 \u00a0 \u5728\u8fd9\u91cc&#xff0c;\u5c06authorizationCodeServices()\u65b9\u6cd5\u8fd4\u56de\u7684\u5bf9\u8c61\u8d4b\u503c\u7ed9authorizationEndpoint\u5bf9\u8c61\u7684authorizationCodeServices\u5c5e\u6027\u3002<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">\u00a0 \u00a0 \u00a0 \u00a0\u70b9\u51fbauthorizationCodeServices()\u65b9\u6cd5&#xff0c;\u5982\u4e0b\u6240\u793a&#xff1a;<\/p>\n<h4 id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8BauthorizationCodeServices\">\u200b\u200b\u200b\u200b\u200b\u200b\u200bauthorizationCodeServices<\/h4>\n<table border=\"1\" cellspacing=\"0\">\n<tbody>\n<tr>\n<td style=\"vertical-align:top;width:426.1000pt\">\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">private AuthorizationCodeServices authorizationCodeServices() throws Exception {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">return getEndpointsConfigurer().getAuthorizationCodeServices();<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">}<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0 \u00a0 \u00a0 \u00a0 \u5728\u8fd9\u91cc&#xff0c;\u8fd4\u56de\u7684\u5bf9\u8c61\u5c31\u662f\u6211\u4eec\u81ea\u5b9a\u4e49\u7684authorizationCodeServices\u5bf9\u8c61&#xff0c;\u70b9\u51fbgetAuthorizationCodeServices()\u65b9\u6cd5&#xff0c;\u5982\u4e0b\u6240\u793a&#xff1a;<\/p>\n<h4 id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8BgetEndpointsConfigurer\">\u200b\u200b\u200b\u200b\u200b\u200b\u200bgetEndpointsConfigurer<\/h4>\n<table border=\"1\" cellspacing=\"0\">\n<tbody>\n<tr>\n<td style=\"vertical-align:top;width:426.1000pt\">\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">private AuthorizationServerEndpointsConfigurer endpoints &#061; new AuthorizationServerEndpointsConfigurer();<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">public AuthorizationServerEndpointsConfigurer getEndpointsConfigurer() {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">if (!endpoints.isTokenServicesOverride()) {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">try {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">endpoints.tokenServices(endpoints.getDefaultAuthorizationServerTokenServices());<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">}<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">catch (Exception e) {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">throw new BeanCreationException(&#034;Cannot create token services&#034;, e);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">}<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">}<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">return endpoints;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">}<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">\u00a0 \u00a0 \u00a0 \u5728\u8fd9\u91cc&#xff0c;\u7531\u4e8e\u6211\u4eec\u81ea\u5b9a\u4e49\u4e86tokenServices\u5bf9\u8c61&#xff0c;endpoints.isTokenServicesOverride()\u662ftrue&#xff0c;\u6240\u4ee5&#xff0c;getEndpointsConfigurer()\u65b9\u6cd5\u76f4\u63a5\u8fd4\u56deAuthorizationServerEndpointsConfigurer\u5bf9\u8c61\u3002<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0 \u00a0 \u00a0 \u00a0\u63a5\u4e0b\u6765&#xff0c;\u6211\u4eec\u6765\u63a2\u7a76\u4e00\u4e0b\/oauth\/authorize\u7aef\u70b9\u5728\u63a5\u6536\u5230HTTP\u8bf7\u6c42\u540e&#xff0c;\u662f\u5982\u4f55\u8bbf\u95eeauthorizationCodeServices\u670d\u52a1\u7684&#xff1f;<\/p>\n<h4 id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8BAuthorizationEndpoint\">\u200b\u200b\u200b\u200b\u200b\u200b\u200bAuthorizationEndpoint <\/h4>\n<table border=\"1\" cellspacing=\"0\">\n<tbody>\n<tr>\n<td style=\"vertical-align:top;width:426.1000pt\">\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">&#064;FrameworkEndpoint<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">&#064;SessionAttributes({AuthorizationEndpoint.AUTHORIZATION_REQUEST_ATTR_NAME, AuthorizationEndpoint.ORIGINAL_AUTHORIZATION_REQUEST_ATTR_NAME})<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">public class AuthorizationEndpoint extends AbstractEndpoint {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">&#8230; &#8230;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">private AuthorizationCodeServices authorizationCodeServices &#061; new InMemoryAuthorizationCodeServices();<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">&#8230; &#8230;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">&#064;RequestMapping(value &#061; &#034;\/oauth\/authorize&#034;)<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">public ModelAndView authorize(Map&lt;String, Object&gt; model, &#064;RequestParam Map&lt;String, String&gt; parameters,\u00a0SessionStatus sessionStatus, Principal principal) {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">AuthorizationRequest authorizationRequest &#061; getOAuth2RequestFactory().createAuthorizationRequest(parameters);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">Set&lt;String&gt; responseTypes &#061; authorizationRequest.getResponseTypes();<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">if (!responseTypes.contains(&#034;token&#034;) &amp;&amp; !responseTypes.contains(&#034;code&#034;)) {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">throw new UnsupportedResponseTypeException(&#034;Unsupported response types: &#034; &#043; responseTypes);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">}<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">&#8230; &#8230;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">if (authorizationRequest.isApproved()) {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">if (responseTypes.contains(&#034;token&#034;)) {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">return getImplicitGrantResponse(authorizationRequest);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">}<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">if (responseTypes.contains(&#034;code&#034;)) {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">return new ModelAndView(getAuthorizationCodeResponse(authorizationRequest,(Authentication) principal));<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">}<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">}<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#8230; &#8230;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">}<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">\u00a0 \u00a0 \u00a0 \u00a0 \u70b9\u51fbgetAuthorizationCodeResponse()\u65b9\u6cd5&#xff0c;\u5982\u4e0b\u6240\u793a&#xff1a;<\/p>\n<h4 id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8BgetAuthorizationCodeResponse\">\u200b\u200b\u200b\u200b\u200b\u200b\u200bgetAuthorizationCodeResponse<\/h4>\n<table border=\"1\" cellspacing=\"0\">\n<tbody>\n<tr>\n<td style=\"vertical-align:top;width:426.1000pt\">\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">private View getAuthorizationCodeResponse(AuthorizationRequest authorizationRequest, Authentication authUser) {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">try {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">return new RedirectView(getSuccessfulRedirect(authorizationRequest,<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">generateCode(authorizationRequest, authUser)), false, true, false);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">}\u00a0catch (OAuth2Exception e) {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">return new RedirectView(getUnsuccessfulRedirect(authorizationRequest, e, false), false, true, false);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">}<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">}<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">\u00a0 \u00a0 \u00a0 \u00a0 \u70b9\u51fbgenerateCode()\u65b9\u6cd5&#xff0c;\u5982\u4e0b\u6240\u793a&#xff1a;<\/p>\n<h4 id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8BgenerateCode\">\u200b\u200b\u200b\u200b\u200b\u200b\u200bgenerateCode<\/h4>\n<table border=\"1\" cellspacing=\"0\">\n<tbody>\n<tr>\n<td style=\"vertical-align:top;width:426.1000pt\">\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">private String generateCode(AuthorizationRequest authorizationRequest, Authentication authentication)\u00a0throws AuthenticationException {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">try {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">OAuth2Request storedOAuth2Request &#061; getOAuth2RequestFactory().createOAuth2Request(authorizationRequest);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">OAuth2Authentication combinedAuth &#061; new OAuth2Authentication(storedOAuth2Request, authentication);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">String code &#061; authorizationCodeServices.createAuthorizationCode(combinedAuth);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">return code;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">}\u00a0catch (OAuth2Exception e) {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">if (authorizationRequest.getState() !&#061; null) {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">e.addAdditionalInformation(&#034;state&#034;, authorizationRequest.getState());<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">}<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">throw e;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">}<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">}<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0 \u00a0 \u00a0 \u00a0 \u5728\u8fd9\u91cc&#xff0c;\u53ef\u4ee5\u770b\u5230\u8c03\u7528\u4e86\u6211\u4eec\u81ea\u5b9a\u4e49\u7684\u670d\u52a1authorizationCodeServices\u7684\u65b9\u6cd5createAuthorizationCode()\u6765\u751f\u6210\u6388\u6743\u7801\u3002<\/p>\n<h2 id=\"%E8%87%AA%E5%AE%9A%E4%B9%89tokenServices\" style=\"text-align:justify\">\u81ea\u5b9a\u4e49tokenServices<\/h2>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">\u00a0 \u00a0 \u00a0 \u00a0\u00a0\u70b9\u51fb\u7b80\u5355\u793a\u4f8b\u91cc\u7684DefaultTokenServices\u7c7b&#xff0c;\u5982\u4e0b\u6240\u793a&#xff1a;<\/p>\n<h3 id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8BDefaultTokenServices\">\u200b\u200b\u200b\u200b\u200b\u200b\u200bDefaultTokenServices <\/h3>\n<table border=\"1\" cellspacing=\"0\">\n<tbody>\n<tr>\n<td style=\"vertical-align:top;width:426.1000pt\">\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">package org.springframework.security.oauth2.provider.token;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">&#8230; &#8230;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">public class DefaultTokenServices implements AuthorizationServerTokenServices, ResourceServerTokenServices,\u00a0ConsumerTokenServices, InitializingBean {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0&#8230; &#8230;<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">\u00a0 \u00a0 \u00a0 \u00a0\u5728\u8fd9\u91cc&#xff0c;\u901a\u8fc7\u5b9e\u4f8b\u5316DefaultTokenServices \u5bf9\u8c61&#xff0c;\u5e76\u8bbe\u7f6etokenStore\u7b49\u5c5e\u6027\u7684\u65b9\u5f0f\u6765\u5b9e\u73b0\u81ea\u5b9a\u4e49tokenServices\u7684\u529f\u80fd\u3002<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">\u00a0 \u00a0 \u00a0 \u00a0\u70b9\u51fb\u7b80\u5355\u793a\u4f8b\u91cc\u7684getTokenStore()\u65b9\u6cd5&#xff0c;\u5982\u4e0b\u6240\u793a&#xff1a;<\/p>\n<h3 id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8BgetTokenStore\">\u200b\u200b\u200b\u200b\u200b\u200b\u200bgetTokenStore<\/h3>\n<table border=\"1\" cellspacing=\"0\">\n<tbody>\n<tr>\n<td style=\"vertical-align:top;width:426.1000pt\">\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">&#064;Bean<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">TokenStore getTokenStore() {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">return new RedisTokenStore(jedisConnectionFactory);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">}<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">\u00a0 \u00a0 \u00a0 \u00a0 \u70b9\u51fbRedisTokenStore\u7c7b&#xff0c;\u5982\u4e0b\u6240\u793a&#xff1a;<\/p>\n<h3 id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8BRedisTokenStore\">\u200b\u200b\u200b\u200b\u200b\u200b\u200bRedisTokenStore <\/h3>\n<table border=\"1\" cellspacing=\"0\">\n<tbody>\n<tr>\n<td style=\"vertical-align:top;width:426.1000pt\">\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">package org.springframework.security.oauth2.provider.token.store.redis;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">&#8230; &#8230;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">public class RedisTokenStore implements TokenStore {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">\u00a0\u00a0\u00a0\u00a0&#8230; &#8230;<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">\u00a0 \u00a0 \u00a0 \u00a0 \u5728\u8fd9\u91cc&#xff0c;\u7c7bRedisTokenStore\u4e5f\u662f\u6846\u67b6\u63d0\u4f9b\u7684\u7c7b&#xff0c;\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u3002<\/p>\n<h3 id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E7%A8%8B%E5%BA%8F%E6%B5%81%E7%A8%8B\">\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u7a0b\u5e8f\u6d41\u7a0b<\/h3>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">\u00a0 \u00a0 \u00a0 \u00a0 \u901a\u8fc7\u524d\u9762\u7684\u6587\u7ae0&#xff0c;\u6211\u4eec\u77e5\u9053\/oauth\/token\u7aef\u70b9\u6709\u4f9d\u8d56\u670d\u52a1tokenServices&#xff0c;\u5982\u4e0b\u6240\u793a&#xff1a;<\/p>\n<h4 id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8BpostAccessToken\">\u200b\u200b\u200b\u200b\u200b\u200b\u200bpostAccessToken <\/h4>\n<table border=\"1\" cellspacing=\"0\">\n<tbody>\n<tr>\n<td style=\"vertical-align:top;width:426.1000pt\">\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">public class TokenEndpoint extends AbstractEndpoint {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0\u00a0\u00a0\u00a0&#8230; &#8230;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">&#064;RequestMapping(value &#061; &#034;\/oauth\/token&#034;, method&#061;RequestMethod.POST)<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">public ResponseEntity&lt;OAuth2AccessToken&gt; postAccessToken(Principal principal, &#064;RequestParam\u00a0Map&lt;String, String&gt; parameters) throws \u00a0HttpRequestMethodNotSupportedException {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">&#8230; &#8230;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">OAuth2AccessToken token &#061; getTokenGranter().grant(tokenRequest.getGrantType(), tokenRequest);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">if (token &#061;&#061; null) {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">throw new UnsupportedGrantTypeException(&#034;Unsupported grant type: &#034; &#043; tokenRequest.getGrantType());<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">}<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">return getResponse(token);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">}<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">\u00a0 \u00a0 \u00a0 \u00a0 \u5728\u8fd9\u91cc&#xff0c;\u70b9\u51fbgetTokenGranter().grant()\u65b9\u6cd5&#xff0c;\u5982\u4e0b\u6240\u793a&#xff1a;<\/p>\n<h4 id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8Bgrant\">\u200b\u200b\u200b\u200b\u200b\u200b\u200bgrant<\/h4>\n<table border=\"1\" cellspacing=\"0\">\n<tbody>\n<tr>\n<td style=\"vertical-align:top;width:426.1000pt\">\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">public OAuth2AccessToken grant(String grantType, TokenRequest tokenRequest) {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">if (!this.grantType.equals(grantType)) {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">return null;<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">}<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">String clientId &#061; tokenRequest.getClientId();<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">ClientDetails client &#061; clientDetailsService.loadClientByClientId(clientId);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">validateGrantType(grantType, client);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">if (logger.isDebugEnabled()) {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">logger.debug(&#034;Getting access token for: &#034; &#043; clientId);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">}<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">return getAccessToken(client, tokenRequest);<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">}<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">\u00a0 \u00a0 \u00a0 \u00a0 \u5728\u8fd9\u91cc&#xff0c;\u70b9\u51fbgetAccessToken()\u65b9\u6cd5&#xff0c;\u5982\u4e0b\u6240\u793a&#xff1a;<\/p>\n<h4 id=\"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8BgetAccessToken\">\u200b\u200b\u200b\u200b\u200b\u200b\u200bgetAccessToken<\/h4>\n<table border=\"1\" cellspacing=\"0\">\n<tbody>\n<tr>\n<td style=\"vertical-align:top;width:426.1000pt\">\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">protected OAuth2AccessToken getAccessToken(ClientDetails client, TokenRequest tokenRequest) {<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">return tokenServices.createAccessToken(getOAuth2Authentication(client, tokenRequest));<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">}<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:left\">\u00a0 \u00a0 \u00a0 \u00a0 \u5728\u8fd9\u91cc&#xff0c;\u53ef\u4ee5\u770b\u5230\u8c03\u7528\u4e86\u6211\u4eec\u81ea\u5b9a\u4e49\u7684\u670d\u52a1tokenServices\u670d\u52a1\u7684createAccessToken()\u65b9\u6cd5\u6765\u751f\u6210TOKEN\u3002<\/p>\n<h2 id=\"%E6%80%BB%E7%BB%93\" style=\"text-align:justify\">\u603b\u7ed3<\/h2>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">\u00a0 \u00a0 \u00a0spring-security\u6846\u67b6\u91cc\u81ea\u5b9a\u4e49clientDetailsService, authorizationCodeServices\u548ctokenServices&#xff0c;\u540c\u6837\u90fd\u662f\u81ea\u5b9a\u4e49\u670d\u52a1&#xff0c;\u53ef\u662f\u5dee\u522b\u8fd8\u662f\u6bd4\u8f83\u5927\u7684\u3002<\/p>\n<p style=\"margin-left:.0001pt;margin-right:0;text-align:justify\">\u00a0 \u00a0 \u00a0 \u00a0\u8fd9\u4e2a\u7ed9\u5f00\u53d1\u5e26\u6765\u6bd4\u8f83\u5927\u7684\u9ebb\u70e6&#xff0c;\u663e\u5f97\u4e0d\u592a\u53cb\u597d\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6587\u7ae0\u6d4f\u89c8\u9605\u8bfb956\u6b21\uff0c\u70b9\u8d5e24\u6b21\uff0c\u6536\u85cf9\u6b21\u3002\u672c\u7bc7\u6587\u7ae0\u7814\u7a76\u4e86spring-security\u6846\u67b6\u91cc\u5982\u4f55\u81ea\u5b9a\u4e49clientDetailsService, authorizationCodeServices\u548ctokenServices\u3002_spring security oauth2\u81ea\u5b9a\u4e49\u8ba4\u8bc1<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[99,4475,4474,4476],"topic":[],"class_list":["post-46859","post","type-post","status-publish","format-standard","hentry","category-server","tag-java","tag-spring-security","tag-4474","tag-4476"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>spring-security-oauth2\u7cfb\u5217\uff1a\u81ea\u5b9a\u4e49\u8ba4\u8bc1\u670d\u52a1\u5668 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/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.wsisp.com\/helps\/46859.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"spring-security-oauth2\u7cfb\u5217\uff1a\u81ea\u5b9a\u4e49\u8ba4\u8bc1\u670d\u52a1\u5668 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"\u6587\u7ae0\u6d4f\u89c8\u9605\u8bfb956\u6b21\uff0c\u70b9\u8d5e24\u6b21\uff0c\u6536\u85cf9\u6b21\u3002\u672c\u7bc7\u6587\u7ae0\u7814\u7a76\u4e86spring-security\u6846\u67b6\u91cc\u5982\u4f55\u81ea\u5b9a\u4e49clientDetailsService, authorizationCodeServices\u548ctokenServices\u3002_spring security oauth2\u81ea\u5b9a\u4e49\u8ba4\u8bc1\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/46859.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2025-07-29T20:27:00+00:00\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/46859.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/46859.html\",\"name\":\"spring-security-oauth2\u7cfb\u5217\uff1a\u81ea\u5b9a\u4e49\u8ba4\u8bc1\u670d\u52a1\u5668 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2025-07-29T20:27:00+00:00\",\"dateModified\":\"2025-07-29T20:27:00+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/46859.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/46859.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/46859.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"spring-security-oauth2\u7cfb\u5217\uff1a\u81ea\u5b9a\u4e49\u8ba4\u8bc1\u670d\u52a1\u5668\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"spring-security-oauth2\u7cfb\u5217\uff1a\u81ea\u5b9a\u4e49\u8ba4\u8bc1\u670d\u52a1\u5668 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","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.wsisp.com\/helps\/46859.html","og_locale":"zh_CN","og_type":"article","og_title":"spring-security-oauth2\u7cfb\u5217\uff1a\u81ea\u5b9a\u4e49\u8ba4\u8bc1\u670d\u52a1\u5668 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"\u6587\u7ae0\u6d4f\u89c8\u9605\u8bfb956\u6b21\uff0c\u70b9\u8d5e24\u6b21\uff0c\u6536\u85cf9\u6b21\u3002\u672c\u7bc7\u6587\u7ae0\u7814\u7a76\u4e86spring-security\u6846\u67b6\u91cc\u5982\u4f55\u81ea\u5b9a\u4e49clientDetailsService, authorizationCodeServices\u548ctokenServices\u3002_spring security oauth2\u81ea\u5b9a\u4e49\u8ba4\u8bc1","og_url":"https:\/\/www.wsisp.com\/helps\/46859.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2025-07-29T20:27:00+00:00","author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"5 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/46859.html","url":"https:\/\/www.wsisp.com\/helps\/46859.html","name":"spring-security-oauth2\u7cfb\u5217\uff1a\u81ea\u5b9a\u4e49\u8ba4\u8bc1\u670d\u52a1\u5668 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2025-07-29T20:27:00+00:00","dateModified":"2025-07-29T20:27:00+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/46859.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/46859.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/46859.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"spring-security-oauth2\u7cfb\u5217\uff1a\u81ea\u5b9a\u4e49\u8ba4\u8bc1\u670d\u52a1\u5668"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/46859","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=46859"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/46859\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=46859"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=46859"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=46859"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=46859"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}