mirror of
https://github.com/spring-projects/spring-security.git
synced 2025-06-22 03:52:15 +00:00
Merge remote-tracking branch 'origin/6.3.x'
This commit is contained in:
commit
c0a10b90ba
@ -1009,6 +1009,15 @@ public class PrePostMethodSecurityConfigurationTests {
|
|||||||
verify(expressionHandler, times(4)).createEvaluationContext(any(Supplier.class), any());
|
verify(expressionHandler, times(4)).createEvaluationContext(any(Supplier.class), any());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// gh-15721
|
||||||
|
@Test
|
||||||
|
@WithMockUser(roles = "uid")
|
||||||
|
public void methodWhenMetaAnnotationPropertiesHasClassProperties() {
|
||||||
|
this.spring.register(MetaAnnotationPlaceholderConfig.class).autowire();
|
||||||
|
MetaAnnotationService service = this.spring.getContext().getBean(MetaAnnotationService.class);
|
||||||
|
assertThat(service.getIdPath("uid")).isEqualTo("uid");
|
||||||
|
}
|
||||||
|
|
||||||
private static Consumer<ConfigurableWebApplicationContext> disallowBeanOverriding() {
|
private static Consumer<ConfigurableWebApplicationContext> disallowBeanOverriding() {
|
||||||
return (context) -> ((AnnotationConfigWebApplicationContext) context).setAllowBeanDefinitionOverriding(false);
|
return (context) -> ((AnnotationConfigWebApplicationContext) context).setAllowBeanDefinitionOverriding(false);
|
||||||
}
|
}
|
||||||
@ -1403,6 +1412,27 @@ public class PrePostMethodSecurityConfigurationTests {
|
|||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@RestrictedAccess(entityClass = EntityClass.class)
|
||||||
|
String getIdPath(String id) {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
@PreAuthorize("hasRole({idPath})")
|
||||||
|
@interface RestrictedAccess {
|
||||||
|
|
||||||
|
String idPath() default "#id";
|
||||||
|
|
||||||
|
Class<?> entityClass();
|
||||||
|
|
||||||
|
String[] recipes() default {};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static class EntityClass {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
@ -20,11 +20,15 @@ import java.lang.annotation.Annotation;
|
|||||||
import java.lang.reflect.AnnotatedElement;
|
import java.lang.reflect.AnnotatedElement;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.lang.reflect.Parameter;
|
import java.lang.reflect.Parameter;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import org.springframework.core.MethodClassKey;
|
import org.springframework.core.MethodClassKey;
|
||||||
import org.springframework.core.annotation.MergedAnnotation;
|
import org.springframework.core.annotation.MergedAnnotation;
|
||||||
|
import org.springframework.core.convert.TypeDescriptor;
|
||||||
|
import org.springframework.core.convert.converter.GenericConverter;
|
||||||
import org.springframework.core.convert.support.DefaultConversionService;
|
import org.springframework.core.convert.support.DefaultConversionService;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
import org.springframework.util.PropertyPlaceholderHelper;
|
import org.springframework.util.PropertyPlaceholderHelper;
|
||||||
@ -64,6 +68,12 @@ import org.springframework.util.PropertyPlaceholderHelper;
|
|||||||
final class ExpressionTemplateSecurityAnnotationScanner<A extends Annotation>
|
final class ExpressionTemplateSecurityAnnotationScanner<A extends Annotation>
|
||||||
extends AbstractSecurityAnnotationScanner<A> {
|
extends AbstractSecurityAnnotationScanner<A> {
|
||||||
|
|
||||||
|
private static final DefaultConversionService conversionService = new DefaultConversionService();
|
||||||
|
|
||||||
|
static {
|
||||||
|
conversionService.addConverter(new ClassToStringConverter());
|
||||||
|
}
|
||||||
|
|
||||||
private final Class<A> type;
|
private final Class<A> type;
|
||||||
|
|
||||||
private final UniqueSecurityAnnotationScanner<A> unique;
|
private final UniqueSecurityAnnotationScanner<A> unique;
|
||||||
@ -120,7 +130,7 @@ final class ExpressionTemplateSecurityAnnotationScanner<A extends Annotation>
|
|||||||
String key = property.getKey();
|
String key = property.getKey();
|
||||||
Object value = property.getValue();
|
Object value = property.getValue();
|
||||||
String asString = (value instanceof String) ? (String) value
|
String asString = (value instanceof String) ? (String) value
|
||||||
: DefaultConversionService.getSharedInstance().convert(value, String.class);
|
: conversionService.convert(value, String.class);
|
||||||
stringProperties.put(key, asString);
|
stringProperties.put(key, asString);
|
||||||
}
|
}
|
||||||
Map<String, Object> annotationProperties = mergedAnnotation.asMap();
|
Map<String, Object> annotationProperties = mergedAnnotation.asMap();
|
||||||
@ -136,4 +146,18 @@ final class ExpressionTemplateSecurityAnnotationScanner<A extends Annotation>
|
|||||||
return MergedAnnotation.of(annotatedElement, this.type, properties);
|
return MergedAnnotation.of(annotatedElement, this.type, properties);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static class ClassToStringConverter implements GenericConverter {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<ConvertiblePair> getConvertibleTypes() {
|
||||||
|
return Collections.singleton(new ConvertiblePair(Class.class, String.class));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
|
||||||
|
return (source != null) ? source.toString() : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user