Spring Boot 2.0.0 + OAuth2

fal*_*ies 7 spring-security oauth-2.0 spring-boot

Spring Boot 2 + Sping Security OAuth2是否仍支持@AuthorizationServer注释?从阅读发行说明开始,有些内容尚未移植:

Oauth2支持

这是我的相关部分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问题也得到了解决

dur*_*dur 8

Spring Security 5使用现代化的密码存储,请参阅OAuth2 Autoconfig:

如果您使用自己的授权服务器配置通过ClientDetailsServiceConfigurer如下所示的实例配置有效客户端列表,请注意您在此配置的密码受Spring Security 5附带的现代化密码存储的约束.

要解决您的问题,请参阅Spring Security Reference:

故障排除

如果存储的密码之一没有id,则会出现以下错误,如"密码存储格式"一节中所述.

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)
Run Code Online (Sandbox Code Playgroud)

解决错误的最简单方法是切换到明确提供PasswordEncoder密码编码的方法.解决问题的最简单方法是弄清楚当前存储密码的方式并明确提供正确的密码PasswordEncoder.如果要从Spring Security 4.2.x迁移,则可以通过公开NoOpPasswordEncoderbean 来恢复到先前的行为.例如,如果您使用的是Java配置,则可以创建如下所示的配置:

恢复NoOpPasswordEncoder不被认为是安全的.您应该迁移到使用DelegatingPasswordEncoder以支持安全密码编码.

@Bean
public static NoOpPasswordEncoder passwordEncoder() {
    return NoOpPasswordEncoder.getInstance();
}
Run Code Online (Sandbox Code Playgroud)

如果您使用的是XML配置,则可以PasswordEncoder使用id 公开a passwordEncoder:

<b:bean id="passwordEncoder"
    class="org.springframework.security.crypto.NoOpPasswordEncoder" factory-method="getInstance"/>
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用正确的ID为所有密码添加前缀并继续使用DelegatingPasswordEncoder.例如,如果您使用的是BCrypt,则可以通过以下方式迁移密码:

$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG
Run Code Online (Sandbox Code Playgroud)

{bcrypt}$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG
Run Code Online (Sandbox Code Playgroud)

  • 在这里详细说明吸烟枪当你试图在基本授权中使用明文客户端ID和明文密码在/ oauth/token获取令牌时.修复是Bcrypt支持SQL数据库中的现有客户端机密.日志中的错误是"编码密码看起来不像BCrypt",因为密码首先没有被编码为任何东西. (3认同)

小智 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)

而已。