diff --git a/.travis.yml b/.travis.yml index d9940bd63..e5186bde2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,5 +12,5 @@ install: ./mvnw -U install --quiet -DskipTests=true -P bootstrap script: - jdk_switcher use openjdk7 - ./mvnw clean test -P bootstrap -# - jdk_switcher use oraclejdk8 -# - ./mvnw -U clean test -P spring5 + - jdk_switcher use oraclejdk8 + - ./mvnw -f spring-security-oauth2 -U clean test -P spring5 \ No newline at end of file diff --git a/pom.xml b/pom.xml index da114c02c..d80f4643a 100644 --- a/pom.xml +++ b/pom.xml @@ -21,6 +21,8 @@ 1.9 4.0.9.RELEASE 3.2.10.RELEASE + 1.5.0.RELEASE + 2.6.3 1.6 @@ -165,8 +167,10 @@ spring5 - 5.0.0.BUILD-SNAPSHOT - 5.0.0.BUILD-SNAPSHOT + 5.0.4.RELEASE + 5.0.3.RELEASE + 2.0.5.RELEASE + 2.9.0 diff --git a/spring-security-oauth2/pom.xml b/spring-security-oauth2/pom.xml index 98eb454d6..59838645c 100644 --- a/spring-security-oauth2/pom.xml +++ b/spring-security-oauth2/pom.xml @@ -161,14 +161,14 @@ org.springframework.data spring-data-redis - 1.5.0.RELEASE + ${spring.data.redis.version} true redis.clients jedis - 2.6.3 + ${redis.clients.version} true diff --git a/spring-security-oauth2/src/main/java/org/springframework/security/oauth2/client/http/OAuth2ErrorHandler.java b/spring-security-oauth2/src/main/java/org/springframework/security/oauth2/client/http/OAuth2ErrorHandler.java index 715a32bf0..af510e2ae 100644 --- a/spring-security-oauth2/src/main/java/org/springframework/security/oauth2/client/http/OAuth2ErrorHandler.java +++ b/spring-security-oauth2/src/main/java/org/springframework/security/oauth2/client/http/OAuth2ErrorHandler.java @@ -118,7 +118,7 @@ public void close() { } public int getRawStatusCode() throws IOException { - return response.getRawStatusCode(); + return this.getStatusCode().value(); } }; diff --git a/spring-security-oauth2/src/main/java/org/springframework/security/oauth2/provider/token/store/redis/RedisTokenStore.java b/spring-security-oauth2/src/main/java/org/springframework/security/oauth2/provider/token/store/redis/RedisTokenStore.java index fb3708f3c..76fbb39aa 100644 --- a/spring-security-oauth2/src/main/java/org/springframework/security/oauth2/provider/token/store/redis/RedisTokenStore.java +++ b/spring-security-oauth2/src/main/java/org/springframework/security/oauth2/provider/token/store/redis/RedisTokenStore.java @@ -1,11 +1,5 @@ package org.springframework.security.oauth2.provider.token.store.redis; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Date; -import java.util.List; - import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.security.oauth2.common.ExpiringOAuth2RefreshToken; @@ -15,6 +9,15 @@ import org.springframework.security.oauth2.provider.token.AuthenticationKeyGenerator; import org.springframework.security.oauth2.provider.token.DefaultAuthenticationKeyGenerator; import org.springframework.security.oauth2.provider.token.TokenStore; +import org.springframework.util.ClassUtils; +import org.springframework.util.ReflectionUtils; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.List; /** * @author efenderbosch @@ -31,14 +34,23 @@ public class RedisTokenStore implements TokenStore { private static final String CLIENT_ID_TO_ACCESS = "client_id_to_access:"; private static final String UNAME_TO_ACCESS = "uname_to_access:"; + private static final boolean springDataRedis_2_0 = ClassUtils.isPresent( + "org.springframework.data.redis.connection.RedisStandaloneConfiguration", + RedisTokenStore.class.getClassLoader()); + private final RedisConnectionFactory connectionFactory; private AuthenticationKeyGenerator authenticationKeyGenerator = new DefaultAuthenticationKeyGenerator(); private RedisTokenStoreSerializationStrategy serializationStrategy = new JdkSerializationStrategy(); private String prefix = ""; + private Method redisConnectionSet_2_0; + public RedisTokenStore(RedisConnectionFactory connectionFactory) { this.connectionFactory = connectionFactory; + if (springDataRedis_2_0) { + this.loadRedisConnectionMethods_2_0(); + } } public void setAuthenticationKeyGenerator(AuthenticationKeyGenerator authenticationKeyGenerator) { @@ -53,6 +65,11 @@ public void setPrefix(String prefix) { this.prefix = prefix; } + private void loadRedisConnectionMethods_2_0() { + this.redisConnectionSet_2_0 = ReflectionUtils.findMethod( + RedisConnection.class, "set", byte[].class, byte[].class); + } + private RedisConnection getConnection() { return connectionFactory.getConnection(); } @@ -157,9 +174,19 @@ public void storeAccessToken(OAuth2AccessToken token, OAuth2Authentication authe RedisConnection conn = getConnection(); try { conn.openPipeline(); - conn.set(accessKey, serializedAccessToken); - conn.set(authKey, serializedAuth); - conn.set(authToAccessKey, serializedAccessToken); + if (springDataRedis_2_0) { + try { + this.redisConnectionSet_2_0.invoke(conn, accessKey, serializedAccessToken); + this.redisConnectionSet_2_0.invoke(conn, authKey, serializedAuth); + this.redisConnectionSet_2_0.invoke(conn, authToAccessKey, serializedAccessToken); + } catch (Exception ex) { + throw new RuntimeException(ex); + } + } else { + conn.set(accessKey, serializedAccessToken); + conn.set(authKey, serializedAuth); + conn.set(authToAccessKey, serializedAccessToken); + } if (!authentication.isClientOnly()) { conn.rPush(approvalKey, serializedAccessToken); } @@ -177,9 +204,18 @@ public void storeAccessToken(OAuth2AccessToken token, OAuth2Authentication authe byte[] refresh = serialize(token.getRefreshToken().getValue()); byte[] auth = serialize(token.getValue()); byte[] refreshToAccessKey = serializeKey(REFRESH_TO_ACCESS + token.getRefreshToken().getValue()); - conn.set(refreshToAccessKey, auth); byte[] accessToRefreshKey = serializeKey(ACCESS_TO_REFRESH + token.getValue()); - conn.set(accessToRefreshKey, refresh); + if (springDataRedis_2_0) { + try { + this.redisConnectionSet_2_0.invoke(conn, refreshToAccessKey, auth); + this.redisConnectionSet_2_0.invoke(conn, accessToRefreshKey, refresh); + } catch (Exception ex) { + throw new RuntimeException(ex); + } + } else { + conn.set(refreshToAccessKey, auth); + conn.set(accessToRefreshKey, refresh); + } if (refreshToken instanceof ExpiringOAuth2RefreshToken) { ExpiringOAuth2RefreshToken expiringRefreshToken = (ExpiringOAuth2RefreshToken) refreshToken; Date expiration = expiringRefreshToken.getExpiration(); diff --git a/spring-security-oauth2/src/test/java/org/springframework/security/oauth2/config/annotation/Gh808EnableAuthorizationServerTests.java b/spring-security-oauth2/src/test/java/org/springframework/security/oauth2/config/annotation/Gh808EnableAuthorizationServerTests.java index 3e8bc61f8..7f0f6e239 100644 --- a/spring-security-oauth2/src/test/java/org/springframework/security/oauth2/config/annotation/Gh808EnableAuthorizationServerTests.java +++ b/spring-security-oauth2/src/test/java/org/springframework/security/oauth2/config/annotation/Gh808EnableAuthorizationServerTests.java @@ -33,6 +33,8 @@ import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.crypto.codec.Base64; +import org.springframework.security.crypto.password.NoOpPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer; import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter; import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer; @@ -188,5 +190,10 @@ public UserDetails loadUserByUsername(String username) throws UsernameNotFoundEx } }; } + + @Bean + public PasswordEncoder passwordEncoder() { + return NoOpPasswordEncoder.getInstance(); + } } } diff --git a/spring-security-oauth2/src/test/java/org/springframework/security/oauth2/config/annotation/ResourceServerConfigurationTests.java b/spring-security-oauth2/src/test/java/org/springframework/security/oauth2/config/annotation/ResourceServerConfigurationTests.java index f6a32703e..fb826eec1 100644 --- a/spring-security-oauth2/src/test/java/org/springframework/security/oauth2/config/annotation/ResourceServerConfigurationTests.java +++ b/spring-security-oauth2/src/test/java/org/springframework/security/oauth2/config/annotation/ResourceServerConfigurationTests.java @@ -36,6 +36,8 @@ import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.core.Authentication; import org.springframework.security.crypto.codec.Base64; +import org.springframework.security.crypto.password.NoOpPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken; import org.springframework.security.oauth2.common.OAuth2AccessToken; import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer; @@ -253,6 +255,10 @@ public void configure(ClientDetailsServiceConfigurer clients) throws Exception { @Configuration protected static class SecurityConfiguration extends WebSecurityConfigurerAdapter { + @Bean + public PasswordEncoder passwordEncoder() { + return NoOpPasswordEncoder.getInstance(); + } } } @@ -275,6 +281,10 @@ public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws E } @Configuration protected static class SecurityConfiguration extends WebSecurityConfigurerAdapter { + @Bean + public PasswordEncoder passwordEncoder() { + return NoOpPasswordEncoder.getInstance(); + } } } diff --git a/spring-security-oauth2/src/test/java/org/springframework/security/oauth2/provider/token/store/redis/RedisTokenStoreTests.java b/spring-security-oauth2/src/test/java/org/springframework/security/oauth2/provider/token/store/redis/RedisTokenStoreTests.java index 5e06e2c92..996e15c21 100644 --- a/spring-security-oauth2/src/test/java/org/springframework/security/oauth2/provider/token/store/redis/RedisTokenStoreTests.java +++ b/spring-security-oauth2/src/test/java/org/springframework/security/oauth2/provider/token/store/redis/RedisTokenStoreTests.java @@ -4,12 +4,17 @@ import org.junit.Test; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import org.springframework.security.authentication.TestingAuthenticationToken; -import org.springframework.security.oauth2.common.*; +import org.springframework.security.oauth2.common.DefaultExpiringOAuth2RefreshToken; +import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken; +import org.springframework.security.oauth2.common.DefaultOAuth2RefreshToken; +import org.springframework.security.oauth2.common.OAuth2AccessToken; +import org.springframework.security.oauth2.common.OAuth2RefreshToken; import org.springframework.security.oauth2.provider.OAuth2Authentication; import org.springframework.security.oauth2.provider.OAuth2Request; import org.springframework.security.oauth2.provider.RequestTokenFactory; import org.springframework.security.oauth2.provider.token.TokenStore; import org.springframework.security.oauth2.provider.token.store.TokenStoreBaseTests; +import org.springframework.util.ClassUtils; import redis.clients.jedis.JedisShardInfo; import java.util.Collection; @@ -32,8 +37,18 @@ public TokenStore getTokenStore() { @Before public void setup() throws Exception { - JedisShardInfo shardInfo = new JedisShardInfo("localhost"); - JedisConnectionFactory connectionFactory = new JedisConnectionFactory(shardInfo); + boolean springDataRedis_2_0 = ClassUtils.isPresent( + "org.springframework.data.redis.connection.RedisStandaloneConfiguration", + this.getClass().getClassLoader()); + + JedisConnectionFactory connectionFactory; + if (springDataRedis_2_0) { + connectionFactory = new JedisConnectionFactory(); + } else { + JedisShardInfo shardInfo = new JedisShardInfo("localhost"); + connectionFactory = new JedisConnectionFactory(shardInfo); + } + tokenStore = new RedisTokenStore(connectionFactory); } diff --git a/spring-security-oauth2/src/test/resources/org/springframework/security/oauth2/config/xml/authorization-server-client-credentials-password-invalid.xml b/spring-security-oauth2/src/test/resources/org/springframework/security/oauth2/config/xml/authorization-server-client-credentials-password-invalid.xml index 5927e0a93..e5c7a91fd 100644 --- a/spring-security-oauth2/src/test/resources/org/springframework/security/oauth2/config/xml/authorization-server-client-credentials-password-invalid.xml +++ b/spring-security-oauth2/src/test/resources/org/springframework/security/oauth2/config/xml/authorization-server-client-credentials-password-invalid.xml @@ -52,6 +52,7 @@ + @@ -65,4 +66,6 @@ + + \ No newline at end of file diff --git a/spring-security-oauth2/src/test/resources/org/springframework/security/oauth2/config/xml/authorization-server-client-credentials-password-valid.xml b/spring-security-oauth2/src/test/resources/org/springframework/security/oauth2/config/xml/authorization-server-client-credentials-password-valid.xml index b6ea89ce4..6d2f5ce67 100644 --- a/spring-security-oauth2/src/test/resources/org/springframework/security/oauth2/config/xml/authorization-server-client-credentials-password-valid.xml +++ b/spring-security-oauth2/src/test/resources/org/springframework/security/oauth2/config/xml/authorization-server-client-credentials-password-valid.xml @@ -33,7 +33,9 @@ - + + + @@ -46,6 +48,7 @@ + @@ -59,4 +62,6 @@ + + \ No newline at end of file