23-Spring Authorization Server结合客户端

网友投稿 1709 2022-08-30

23-Spring Authorization Server结合客户端

23-Spring Authorization Server结合客户端

Spring Authorization Server的服务器已经在上一篇中搭建好了,并注册了一个OAuth2客户端,本篇将利用这个注册的客户端实现​​HttpSecurity.oauth2Client​​功能。

本文DEMO:springauthserver 分支。

授权服务器补充配置

上一篇搭建Spring Authorization Server授权服务器如果想投入使用,还要做一个配置。

注册一个用户

OAuth2客户端请求授权跳转到授权服务器,需要一个授权服务器用户登录认证并同意授权。我们在Spring Authorization Server授权服务器中临时指定一个测试用户​​felord​​​,密码为​​123456​​:

@Bean UserDetailsService users() { UserDetails user = User.builder() .username("felord") .password("123456") .passwordEncoder(PasswordEncoderFactories.createDelegatingPasswordEncoder()::encode) .roles("USER") .build(); return new InMemoryUserDetailsManager(user); }

这个用户就是OAuth2中的资源拥有者(Resource Owner)。

OAuth2客户端配置

OAuth2客户端配置简单的多,经历了前面gitee和个性化wechat配置后,配置这个应该不是太难,否则就是你没有好好深入练习。

配置文件

先配置OAuth2客户端的配置文件,这里要对照着Spring Authorization Server中注册的那个OAuth2客户端。这里抄过来对照:

private RegisteredClient createRegisteredClient(final String id) { return RegisteredClient.withId(UUID.randomUUID().toString())// 客户端ID .clientId("felord")// 此处为了避免频繁启动重复写入仓库 .id(id)// client_secret_basic 模式下的密码 在客户端需要存明文 在授权服务器存密文 .clientSecret(PasswordEncoderFactories.createDelegatingPasswordEncoder() .encode("secret"))// 名称可不定义 .clientName("felord")// 授权方法 .clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_BASIC)// 支持的授权类型 .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE) .authorizationGrantType(AuthorizationGrantType.REFRESH_TOKEN) .authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS)// 回调地址名单,不在此列将被拒绝 而且只能使用IP或者域名 不能使用 localhost .redirectUri(" .redirectUri(" .redirectUri(" .redirectUri(" .redirectUri(" OIDC支持 .scope(OidcScopes.OPENID)// 其它Scope .scope("message.read") .scope("userinfo") .scope("message.write")// JWT的配置项 包括TTL 是否复用refreshToken等等 .tokenSettings(TokenSettings.builder().build())// 配置客户端相关的配置项,包括验证密钥或者 是否需要授权页面 .clientSettings(ClientSettings.builder() .requireAuthorizationConsent(true).build()) .build(); }

对应的​​yaml​​配置:

spring: security: oauth2: client: registration: felord: client-id: felord client-secret: secret # redirect-uri: '{baseUrl}/login/oauth2/code/{registrationId}' # 这里不能用localhost redirect-uri: ' authorization-grant-type: authorization_code client-authentication-method: client_secret_basic scope: message.read,message.write provider: felord: issuer-uri: issuer-uri 可以简化下面的配置# authorization-uri: token-uri: user-info-uri: user-name-attribute: username# user-info-authentication-method: GET

​​/.well-known/oauth-authorization-server​​​端点能替代很多​​provider​​​的配置项,如果同时存在​​issuer-uri​​​和其它端点,​​issuer-uri​​​的优先级要低一些,相关的解析逻辑请参考​​ClientRegistrations​​类。

redirect-uri

​​/foo/bar​​是一个测试接口:

@GetMapping("/foo/bar") public Map bar(@RegisteredOAuth2AuthorizedClient("felord") OAuth2AuthorizedClient client){ Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); Map map = new HashMap<>(); map.put("authentication",authentication); // OAuth2AuthorizedClient 为敏感信息不应该返回前端 map.put("oAuth2AuthorizedClient",client); return map; }

根据​​OAuth2ClientConfigurer​​​一文中的讲解,​​/foo/bar​​需要配置匿名访问,伪代码

.authorizeRequests((requests) -> requests// .antMatchers("/foo/bar").anonymous() .antMatchers("/foo/bar") .hasAnyAuthority("ROLE_ANONYMOUS") );

其它的复用前面几个客户端​​HttpSecurity.oauth2Client()​​的配置即可。

测试

这里要先启动OAuth2授权服务器,后启动OAuth2客户端,因为客户端需要调用​​issuer-uri​​初始化OAuth2授权服务器的信息。

到这里​​oauth2Client​​的流程就跑通了。下一篇我将着重对Spring Authorization Server的在该流程中的处理逻辑进行分析。

如果你在学习中遇到问题,可以留言,也可以联系我。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Go语言之Gin框架,实现在web界面添加、删除vsftp用户功能(四)
下一篇:Gong服务实现平滑重启分析(微服务平滑重启)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~