diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/resource/UserInfoTokenServices.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/resource/UserInfoTokenServices.java index f36fd3e9b8..f09c60234a 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/resource/UserInfoTokenServices.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/resource/UserInfoTokenServices.java @@ -99,7 +99,13 @@ public class UserInfoTokenServices implements ResourceServerTokenServices { return new OAuth2Authentication(request, token); } - private Object getPrincipal(Map map) { + /** + * Return the principal that should be used for the token. The default implementation + * looks for well know {@code user*} keys in the map. + * @param map the source map + * @return the principal or {@literal "unknown"} + */ + protected Object getPrincipal(Map map) { for (String key : PRINCIPAL_KEYS) { if (map.containsKey(key)) { return map.get(key); diff --git a/spring-boot/src/main/java/org/springframework/boot/bind/RelaxedDataBinder.java b/spring-boot/src/main/java/org/springframework/boot/bind/RelaxedDataBinder.java index cc3553a4b3..44ba7ae7ee 100644 --- a/spring-boot/src/main/java/org/springframework/boot/bind/RelaxedDataBinder.java +++ b/spring-boot/src/main/java/org/springframework/boot/bind/RelaxedDataBinder.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2015 the original author or authors. + * Copyright 2012-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -343,7 +343,7 @@ public class RelaxedDataBinder extends DataBinder { return; } Object extend = new LinkedHashMap(); - if (!elementDescriptor.isMap() && path.isArrayIndex(index + 1)) { + if (!elementDescriptor.isMap() && path.isArrayIndex(index)) { extend = new ArrayList(); } wrapper.setPropertyValue(path.prefix(index + 1), extend); diff --git a/spring-boot/src/test/java/org/springframework/boot/bind/RelaxedDataBinderTests.java b/spring-boot/src/test/java/org/springframework/boot/bind/RelaxedDataBinderTests.java index 69f7d2f2ea..e5ab4a48cb 100644 --- a/spring-boot/src/test/java/org/springframework/boot/bind/RelaxedDataBinderTests.java +++ b/spring-boot/src/test/java/org/springframework/boot/bind/RelaxedDataBinderTests.java @@ -643,6 +643,16 @@ public class RelaxedDataBinderTests { assertThat(target.getFooBaz()).isEqualTo("boo"); } + @Test + public void testIndexBounds() throws Exception { + VanillaTarget target = new VanillaTarget(); + RelaxedDataBinder binder = getBinder(target, "test"); + MutablePropertyValues values = new MutablePropertyValues(); + values.add("test.objects[0]", "teststring"); + binder.bind(values); + assertThat(target.getObjects()).containsExactly("teststring"); + } + private void doTestBindCaseInsensitiveEnums(VanillaTarget target) throws Exception { BindingResult result = bind(target, "bingo: THIS"); assertThat(result.getErrorCount()).isEqualTo(0); @@ -1001,6 +1011,8 @@ public class RelaxedDataBinderTests { private List bingos; + private List objects; + public char[] getBar() { return this.bar; } @@ -1056,6 +1068,15 @@ public class RelaxedDataBinderTests { public void setBingos(List bingos) { this.bingos = bingos; } + + public List getObjects() { + return this.objects; + } + + public void setObjects(List objects) { + this.objects = objects; + } + } enum Bingo { @@ -1076,4 +1097,5 @@ public class RelaxedDataBinderTests { } } + }