首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

是否可以在Spring Boot中配置OAuth2以响应JSON而不是InvalidTokenException的HTML?

是的,可以在Spring Boot中配置OAuth2以响应JSON而不是InvalidTokenException的HTML。在Spring Boot中,可以通过以下步骤来实现:

  1. 首先,确保你的Spring Boot项目中已经引入了Spring Security和Spring Security OAuth2的依赖。
  2. 创建一个自定义的异常处理器(ExceptionHandler),用于处理InvalidTokenException异常并返回JSON格式的错误信息。可以通过实现OAuth2ExceptionRenderer接口来自定义异常处理器。
  3. 在自定义异常处理器中,可以使用OAuth2Exception对象获取有关异常的详细信息,并将其封装为JSON格式的错误响应。
  4. 在Spring Boot的配置文件中,配置自定义异常处理器的Bean,以便在出现InvalidTokenException异常时自动调用。

下面是一个示例代码,演示了如何在Spring Boot中配置OAuth2以响应JSON格式的错误信息:

代码语言:txt
复制
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.exceptionHandling()
            .authenticationEntryPoint(new OAuth2AuthenticationEntryPoint())
            .accessDeniedHandler(new OAuth2AccessDeniedHandler());
    }

    @Bean
    public OAuth2ExceptionRenderer exceptionRenderer() {
        return new CustomOAuth2ExceptionRenderer();
    }

    private static class CustomOAuth2ExceptionRenderer implements OAuth2ExceptionRenderer {

        private final DefaultOAuth2ExceptionRenderer defaultRenderer = new DefaultOAuth2ExceptionRenderer();

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, HttpServletResponse response) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, response);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, Writer responseWriter) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, responseWriter);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, OutputStream responseOutputStream) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, responseOutputStream);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, ResponseBodyEmitter responseEmitter) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, responseEmitter);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, AsyncResponse response) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, response);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, AsyncContext context) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, context);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, WebSocketSession session) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, session);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, DataOutput responseOutput) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, responseOutput);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, NativeWebRequest request) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, request);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, ServletResponse response) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, response);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, ServletOutputStream responseOutputStream) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, responseOutputStream);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, Writer responseWriter, boolean isStreaming) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, responseWriter, isStreaming);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, OutputStream responseOutputStream, boolean isStreaming) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, responseOutputStream, isStreaming);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, ResponseBodyEmitter responseEmitter, boolean isStreaming) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, responseEmitter, isStreaming);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, AsyncResponse response, boolean isStreaming) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, response, isStreaming);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, AsyncContext context, boolean isStreaming) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, context, isStreaming);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, WebSocketSession session, boolean isStreaming) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, session, isStreaming);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, DataOutput responseOutput, boolean isStreaming) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, responseOutput, isStreaming);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, NativeWebRequest request, boolean isStreaming) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, request, isStreaming);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, ServletResponse response, boolean isStreaming) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, response, isStreaming);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, ServletOutputStream responseOutputStream, boolean isStreaming, boolean isAsync) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, responseOutputStream, isStreaming, isAsync);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, Writer responseWriter, boolean isStreaming, boolean isAsync) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, responseWriter, isStreaming, isAsync);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, OutputStream responseOutputStream, boolean isStreaming, boolean isAsync) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, responseOutputStream, isStreaming, isAsync);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, ResponseBodyEmitter responseEmitter, boolean isStreaming, boolean isAsync) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, responseEmitter, isStreaming, isAsync);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, AsyncResponse response, boolean isStreaming, boolean isAsync) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, response, isStreaming, isAsync);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, AsyncContext context, boolean isStreaming, boolean isAsync) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, context, isStreaming, isAsync);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, WebSocketSession session, boolean isStreaming, boolean isAsync) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, session, isStreaming, isAsync);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, DataOutput responseOutput, boolean isStreaming, boolean isAsync) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, responseOutput, isStreaming, isAsync);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, NativeWebRequest request, boolean isStreaming, boolean isAsync) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, request, isStreaming, isAsync);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, ServletResponse response, boolean isStreaming, boolean isAsync) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, response, isStreaming, isAsync);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, ServletOutputStream responseOutputStream, boolean isStreaming, boolean isAsync, boolean isWebSocket) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, responseOutputStream, isStreaming, isAsync, isWebSocket);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, Writer responseWriter, boolean isStreaming, boolean isAsync, boolean isWebSocket) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, responseWriter, isStreaming, isAsync, isWebSocket);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, OutputStream responseOutputStream, boolean isStreaming, boolean isAsync, boolean isWebSocket) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, responseOutputStream, isStreaming, isAsync, isWebSocket);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, ResponseBodyEmitter responseEmitter, boolean isStreaming, boolean isAsync, boolean isWebSocket) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, responseEmitter, isStreaming, isAsync, isWebSocket);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, AsyncResponse response, boolean isStreaming, boolean isAsync, boolean isWebSocket) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, response, isStreaming, isAsync, isWebSocket);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, AsyncContext context, boolean isStreaming, boolean isAsync, boolean isWebSocket) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, context, isStreaming, isAsync, isWebSocket);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, WebSocketSession session, boolean isStreaming, boolean isAsync, boolean isWebSocket) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, session, isStreaming, isAsync, isWebSocket);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, DataOutput responseOutput, boolean isStreaming, boolean isAsync, boolean isWebSocket) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, responseOutput, isStreaming, isAsync, isWebSocket);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, NativeWebRequest request, boolean isStreaming, boolean isAsync, boolean isWebSocket) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, request, isStreaming, isAsync, isWebSocket);
        }

        @Override
        public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest, ServletResponse response, boolean isStreaming, boolean isAsync, boolean isWebSocket) throws Exception {
            defaultRenderer.handleHttpEntityResponse(responseEntity, webRequest, response, isStreaming, isAsync, isWebSocket);
        }
    }
}

在上述示例中,CustomOAuth2ExceptionRenderer类实现了OAuth2ExceptionRenderer接口,并重写了其中的方法,以便自定义处理InvalidTokenException异常的行为。

通过以上配置,当出现InvalidTokenException异常时,Spring Boot将会返回JSON格式的错误响应,而不是默认的HTML页面。

请注意,以上示例仅演示了如何在Spring Boot中配置OAuth2以响应JSON格式的错误信息。具体的实现方式可能因项目的具体需求而有所不同。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Spring Boot 中文参考指南(二)-Web

编程模型,您可以使用其中一个可用实现,不是Spring MVC。...应用程序添加spring-boot-starter-web和spring-boot-starter-webflux模块会导致Spring Boot自动配置Spring MVC,不是WebFlux。...对于机器客户端,它会产生一个JSON响应,其中包含错误、HTTP状态和异常消息详细信息。对于浏览器客户端,有一个“白页”错误处理程序,HTML格式呈现相同数据。...使用不透明令牌不是JWT情况下,您可以配置以下属性通过introspection来验证令牌: spring.security.oauth2.resourceserver.opaquetoken.introspection-uri...可以使用@Enable*HttpSession(servlet)或@Enable*WebSession(反应式)来控制Spring Session配置,这将导致自动配置后退,然后可以使用注解属性不是之前描述配置属性来配置

3.8K30

Spring Security Oauth2 单点登录案例实现和执行流程剖析

“客户端”登录需要获取OAuth提供令牌,否则将提示认证失败导致客户端无法访问服务。关于OAuth2这里就不多作介绍了,网上资料详尽。...安全配置类里我们配置了: 1. 配置请求URL访问策略。 2. 自定义了同一认证登录页面URL。 3. 配置用户名密码信息从内存创建并获取。...主要配置 oauth2 认证相关配置。...Resource服务器要求安全验证,于是直接从授权服务器获取认证授权信息进行判断后(最后会响应给UI服务器,UI服务器再响应给浏览器) 结合我们案例,首先,我们通过 http://localhost...获取不到之前保存 token,或者 token 已经过期,此时会继续判断请求是否携带从认证服务器获取授权码。 2.

2.4K20

Spring Security-----SpringSocial社交登录详解

因此,我们完全可以使用Spring Social帮助我们,Spring Social对OAuth2标准进行了完整友好封装。...当然各平台用户不同、业务不同,所以提供接口不一样。 ---- OAuth2认证源码 首先在实现OAuth2登录认证过程,有多次我们自己开发应用和社交媒体平台之间请求和响应。...通过这三个字段体现自开发应用用户与服务提供商用户之间关系,从而判定服务提供商用户是否可以通过OAuth2认证登录我们应用。...Spring Boot2.0环境下不要使用Spring Social1.x,改动比较大。...其文档关键截图如下: 从截图中,我们可以看到相应结果是一个用“&”分割字符串,这种数据结构既不是JSON,也不是XML,是无法自动转成对象,所以需要我们手动来改造一下,重写postForAccessGrant

1.8K20

Spring Cloud实战|4.SpringCloud 整合security.实现认证中心

UserDetailsService 通过实现该service,用来添加根据用户名 来获取用户信息逻辑,可以从数据库获取,也可以从其他服务获取用户信息 AuthorizationServerConfigurerAdapter...这里主要配置了如下内容: 设置哪些资源不被拦截 设置基本认证 添加默认用户名和密码认证器提供者DaoAuthenticationProvider 设置用户名密码验证提供者用户获取来源sysUserDetailsService...这里配置了如下内容: 设置oauth客户端 获取信息来源 clientDetailsService 设置默认token存储方式(后面改成redis存储) 添加token增强器(token添加用户信息...创建获取token 入口 为了能够捕获认证过程中出现所有异常,这里通过复写securitytoken入口,来实现此目的 内容其实少,就是手动去调用tokenPoint方法触发 package....: DEBUG nacos添加配置 ams-auth.yaml TEST: 111 # 随便配置,后面需要按需配置 ams-common.yaml redis: host: cloud.lebao.site

61111

SpringBoot学习笔记(十五:OAuth2

由于整个授权过程,第三方应用都无须触及用户密码就可以取得部分资源使用权限,所以OAuth是安全开放。...注意,令牌位置是 URL 锚点(fragment),不是查询字符串(querystring),这是因为 OAuth 2.0 允许跳转网址是 HTTP 协议,因此存在"中间人攻击"风险,浏览器跳转时...这种方式给出令牌,是针对第三方应用不是针对用户,即有可能多个用户共享同一个令牌。 二、实践 1、密码模式 如果是自建单点服务,一般都会使用密码模式。...(authenticationManager)将SecurityauthenticationManager配置到Endpoints,否则,Spring Security配置权限控制将不会在进行...OAuth2 Demo —— 密码模式(Password) 【11】:Spring Security OAuth专题学习-密码模式及客户端模式实例 【12】:Spring Boot and OAuth2

80320

Spring底层原理高级进阶】【SpringCloud整合Spring Security OAuth2】深入了解 Spring Security OAuth2:底层解析+使用方法+实战

Spring Cloud可以通过配置Spring Security来启用HTTPS。首先,需要生成SSL证书,并将其配置到应用程序。...客户端应采取适当安全措施,如存储令牌时进行加密处理。 Spring Cloud可以使用Spring Security OAuth2来实现令牌保密性。...JWT(JSON Web Tokens):JWT是一种基于JSON令牌格式,用于OAuth2协议中表示令牌。JWT可用于令牌包含更多声明信息,以便于验证和传递用户身份信息。...我们可以相应配置添加自定义配置,例如定义访问规则、认证管理器等。...可以使用Spring Security OAuth2Spring Boot来实现授权服务器。

58710

Spring OAuth2 实现始终获取新令牌

Spring基于OAuth2协议编写spring-oauth2实现,是行业级接口资源安全解决方案,我们可以基于该依赖配置不同客户端不同权限来访问接口数据。...),对于这种结果并不是我们期望。...从阅读源码可以发现无论我们配置使用什么方式来进行存储令牌,同一个账户有效令牌只会存在一个,结合上面的场景来思考所以第二个人获取令牌与第一个人是同一个。...,调用refreshAccessToken方法时需要删除响应refresh_token返回字段并把新请求令牌与刷新令牌进行绑定。...本篇文章示例源码可以通过以下途径获取,目录为oauth2-always-create-token: Gitee:https://gitee.com/hengboy/spring-boot-chapter

2K20

Spring宣布旧Spring Security OAuth彻底停止维护,连文档仓库都没了

Spring Security OAuth仓库已经迁移 Spring Security OAuthSpring Boot自动配置代码仓库也一并被迁移,也就是说Spring Boot相关自动配置也被移除...Spring Security OAuth2 Boot仓库被迁移 从这种情况看来大约Spring Security OAuth的确是死了。难道就没有可用了吗?当然不是。...迁移指南 这是胖哥总结迁移指南。 依赖项检查 那么如何检查你项目是否用了旧OAuth2设施呢?当然是对依赖进行检查。...> 你可以通过mvn dependency:tree来检查依赖树是否集成了上述依赖项。...最新0.3.0版本,官方文档正式spring.io上线,需要你知道是它必须在Java 11及以上版本才能使用。

2.7K20

深度解析 Spring Security:身份验证、授权、OAuth2 和 JWT 身份验证完整指南

Spring Boot Starters Spring Boot Starters 是一组方便依赖描述符,您可以将它们包含在您应用程序。...自动配置 Spring Boot 自动配置是一项强大且方便功能,它可以根据某些依赖项和属性存在轻松配置应用程序 bean 和其他组件。...执行器 Spring Boot 执行器是 Spring Boot 一组生产就绪特性,它允许您各种方式监视和管理应用程序。...Spring Boot 执行器一些关键特征包括: 健康端点:公开有关应用程序健康状况信息,例如它是否正在运行以及可能遇到任何问题。...Spring Boot 执行器通常用于生产环境监视应用程序健康和性能,并识别可能出现任何问题。它们也可以开发和测试环境中使用,了解应用程序内部工作原理。

22010

认证鉴权与API权限控制微服务架构设计与实现(三)

@EnableResourceServer这个注解很重要,OAuth2资源服务器简便注解。其使得Spring Security filter通过请求OAuth2 token来验证请求。...关联 HttpSecurity,与之前 Spring Security XML "http"元素配置类似,它允许配置基于web安全针对特定http请求。...文章开头资源服务器配置代码可以看出,对于所有的资源并没有做拦截,因为网关处是调用Auth系统相关endpoint,并不是所有的请求url都会经过一遍Auth系统,所以对于所有的资源,Auth系统...,通过,对于某些接口,接口内进行操作之前,对特殊地方还要再次进行校验。...--- 参考 微服务API级权限技术架构 spring-security-oauth Spring-Security Docs 相关阅读 认证鉴权与API权限控制微服务架构设计与实现(一) 认证鉴权与

2.4K40

Spring Cloud Alibaba 项目搭建

predicates: - Path=/bi-gateway/api/** filters: # 过滤器,请求传递过程可以通过过滤器对其进行一定修改...启动项目 获取token 假设咱们一个 web 端使用,grant_type 是 password,表明这是使用 OAuth2 密码模式。...username=admin 和 password=123456 就相当于 web 端登录界面输入用户名和密码,我们认证服务端配置中固定了用户名是 admin 、密码是 123456,线上环境则应该通过查询数据库获取...==,可以通过 https://www.sojson.com/base64.html 在线编码获取。...token,也是本次请求主要目的 token_type:为 bearer,这是 access token 最常用一种形式 refresh_token:之后可以用这个值来换取新 token,不用输入账号密码

50765

Spring BootOAuth2

用FaceBook做单点登录 本节,我们创建一个使用Facebook进行身份验证应用程序。如果我们利用Spring Boot自动配置功能,这一过程将相当容易。...只要不关闭MVC自动配置,webjar定位器Spring Boot应用程序默认激活。 在做了以上改变,我们应用程序主页应该更加美观了。...所需要是将过滤器连接起来,以便在Spring Boot应用程序正确顺序调用它。...提示: User对象添加一个字段链接到外部提供程序唯一标识符(不是用户名,而是外部提供程序帐户唯一标志)。...error=true"; } 示例应用程序,我们将它放在主应用程序类,该类现在是 @Controller (不是 @RestController),因此它可以处理重定向。

10.6K120

从零开始Spring Security Oauth2(三)

(类名比较类似,注意区分,Adapter结尾是适配器,Configurer结尾配置器,Builder结尾是建造器,他们分别代表不同设计模式,对设计模式有所了解可以更加方便理解其设计思路)...还记得我们一开始配置配置了资源服务器,是它触发了相关配置。...,不是与获取token密切相关。...具体配置应该在@EnableResourceServer中被覆盖,这是适配器+配置好处。 总结 到这儿,Spring Security OAuth2整个内部流程就算是分析结束了。...分析源码过程总结出一点经验,与君共勉: 先掌握宏观,如研究UML类图,搞清楚关联 分析顶级接口,设计是面向接口,不重要部分,具体实现类甚至都可以忽略 学会对比,如ResourceServer和

1.6K50

Oauth2协议

fr=aladdin Oauth 协议:https://tools.ietf.org/html/rfc6749 下边分析一个Oauth2认证例子,网站使用微信认证过程: 1.用户进入网站登录页面...,点击微信图标微信账号登录系统,用户是自己微信里信息资源拥有者。...集中式授权,简化客户端 ​ HTTP/JSON友好,易于请求和传递token ​ 考虑多种客户端架构场景 ​ 客户可以具有不同信任级别 缺点: 协议框架太宽泛,造成各种实现兼容性和互操作性差 ​...校验通过可以获取资源。 ---- Spring Security Oauth2授权码模式 创建项目 添加依赖 <?xml version="1.0" encoding="UTF-8"?...直接存在内存,这在生产环境是不合理,下面我们将其改造成存储Redis 添加依赖及配置 pom.xml <!

1.3K10

Spring Boot版本历史

在这个版本Spring Boot 主要实现了以下功能:自动配置可以根据类路径上依赖关系,自动配置 Spring 应用程序各个组件和功能。...DevTools:提供了开发时一些实用工具,如自动重启、热部署等。Spring Boot 2.xSpring Boot 2.x 是 Spring 5.x 基础上开发,于 2018 年发布。...响应式编程Spring Boot 2.x 支持响应式编程,提供了对 WebFlux 和 Reactive Streams 支持。...WebFlux 是 Spring Framework 5.x 一个新 Web 框架,支持响应式编程,可以提高应用程序吞吐量和并发性能。...Spring Security 5.x 也支持 JWT(JSON Web Tokens)认证,这是一种安全认证方式,可以各个应用程序之间共享认证信息。

2.3K10
领券