fal*_*ies 7 spring-security oauth-2.0 spring-boot
Spring Boot 2 + Sping Security OAuth2是否仍支持@AuthorizationServer注释?从阅读发行说明开始,有些内容尚未移植:
这是我的相关部分build.grade:
Auth服务器
// security
compile "org.springframework.boot:spring-boot-starter-security:${springBootVersion}"
// oauth
// https://mvnrepository.com/artifact/org.springframework.security.oauth/spring-security-oauth2
compile "org.springframework.security.oauth:spring-security-oauth2:2.2.1.RELEASE"
Run Code Online (Sandbox Code Playgroud)
客户端服务器
// support for Oauth2 user token services not yet migrated into Spring Boot 2.0
compile "org.springframework.security.oauth.boot:spring-security-oauth2-autoconfigure:2.0.1.BUILD-SNAPSHOT"
Run Code Online (Sandbox Code Playgroud)
而现在我的授权服务器的oauth2端点只返回一个401,当我试图通过一个客户端ID和客户端秘密为Basic Authentication对/oauth/token.传入用户名和密码会产生不同的代码路径.所以OAuth过滤器看起来并不完整.
我也发现了这一点:Spring Boot 2 OAuth2启动器更改.
是否有配置更新或我是否需要一组不同的gradle依赖项才能将Authorization Server恢复到之前的状态?
谢谢!
UPDATE
我想关闭这个问题的循环.除了加密客户端机密.从Spring OAuth 2.3.2:Spring OAuth 2.3.2开始,RedisTokenStore问题也得到了解决
Spring Security 5使用现代化的密码存储,请参阅OAuth2 Autoconfig:
如果您使用自己的授权服务器配置通过
ClientDetailsServiceConfigurer如下所示的实例配置有效客户端列表,请注意您在此配置的密码受Spring Security 5附带的现代化密码存储的约束.
要解决您的问题,请参阅Spring Security Reference:
故障排除
如果存储的密码之一没有id,则会出现以下错误,如"密码存储格式"一节中所述.
Run Code Online (Sandbox Code Playgroud)java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null" at org.springframework.security.crypto.password.DelegatingPasswordEncoder$UnmappedIdPasswordEncoder.matches(DelegatingPasswordEncoder.java:233) at org.springframework.security.crypto.password.DelegatingPasswordEncoder.matches(DelegatingPasswordEncoder.java:196)解决错误的最简单方法是切换到明确提供
PasswordEncoder密码编码的方法.解决问题的最简单方法是弄清楚当前存储密码的方式并明确提供正确的密码PasswordEncoder.如果要从Spring Security 4.2.x迁移,则可以通过公开NoOpPasswordEncoderbean 来恢复到先前的行为.例如,如果您使用的是Java配置,则可以创建如下所示的配置:恢复
NoOpPasswordEncoder不被认为是安全的.您应该迁移到使用DelegatingPasswordEncoder以支持安全密码编码.Run Code Online (Sandbox Code Playgroud)@Bean public static NoOpPasswordEncoder passwordEncoder() { return NoOpPasswordEncoder.getInstance(); }如果您使用的是XML配置,则可以
PasswordEncoder使用id 公开apasswordEncoder:Run Code Online (Sandbox Code Playgroud)<b:bean id="passwordEncoder" class="org.springframework.security.crypto.NoOpPasswordEncoder" factory-method="getInstance"/>或者,您可以使用正确的ID为所有密码添加前缀并继续使用
DelegatingPasswordEncoder.例如,如果您使用的是BCrypt,则可以通过以下方式迁移密码:Run Code Online (Sandbox Code Playgroud)$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG至
Run Code Online (Sandbox Code Playgroud){bcrypt}$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG
小智 6
OAuth2 AuthorizationServer使用基本身份验证。
因此,您还需要使用AuthorizationServerConfig中的proxyedPasswordEncoder对客户端机密进行编码,以完全解决“没有为id“ null”映射任何PasswordEncoder“异常。
刘瑶的回答解决了我的问题。
1)创建了一个自动连接PasswordEncoder的bean;
@Bean
public PasswordEncoder passwordEncoder() {
String idForEncode = "bcrypt";
Map<String, PasswordEncoder> encoderMap = new HashMap<>();
encoderMap.put(idForEncode, new BCryptPasswordEncoder());
return new DelegatingPasswordEncoder(idForEncode, encoderMap);
}
Run Code Online (Sandbox Code Playgroud)
2)AuthorizationServerConfig类中的自动有线passwordEncoder;
@Autowired
private PasswordEncoder passwordEncoder;
Run Code Online (Sandbox Code Playgroud)
3)使用passwordEncoder编码CLIENT_SECRET。
@Override
public void configure(ClientDetailsServiceConfigurer configurer) throws Exception {
configurer
.inMemory()
.withClient(CLIENT_ID)
.secret(passwordEncoder.encode(CLIENT_SECRET))
.authorizedGrantTypes(GRANT_TYPE_FOR_LOGIN, GRANT_TYPE_FOR_REFRESH)
.scopes(SCOPE_READ, SCOPE_WRITE)
.accessTokenValiditySeconds(TOKEN_VALIDITY_SECONDS)
.refreshTokenValiditySeconds(TOKEN_VALIDITY_SECONDS)
.resourceIds(RESOURCES_IDS);
}
Run Code Online (Sandbox Code Playgroud)
而已。
| 归档时间: |
|
| 查看次数: |
7407 次 |
| 最近记录: |