Add @AuthenticationPrincipal expression
It is now possible to provide a SpEL expression for @AuthenticationPrincipal. This allows invoking custom logic including methods on the principal object. Fixes gh-3859
This commit is contained in:
@@ -119,6 +119,25 @@ public class AuthenticationPrincipalArgumentResolverTests {
|
||||
.isEqualTo(expectedPrincipal);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void resolveArgumentSpel() throws Exception {
|
||||
CustomUserPrincipal principal = new CustomUserPrincipal();
|
||||
setAuthenticationPrincipal(principal);
|
||||
this.expectedPrincipal = principal.property;
|
||||
assertThat(this.resolver.resolveArgument(showUserSpel(), null, null, null))
|
||||
.isEqualTo(this.expectedPrincipal);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void resolveArgumentSpelCopy() throws Exception {
|
||||
CopyUserPrincipal principal = new CopyUserPrincipal("property");
|
||||
setAuthenticationPrincipal(principal);
|
||||
Object resolveArgument = this.resolver.resolveArgument(showUserSpelCopy(), null,
|
||||
null, null);
|
||||
assertThat(resolveArgument).isEqualTo(principal);
|
||||
assertThat(resolveArgument).isNotSameAs(principal);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void resolveArgumentNullOnInvalidType() throws Exception {
|
||||
setAuthenticationPrincipal(new CustomUserPrincipal());
|
||||
@@ -175,6 +194,14 @@ public class AuthenticationPrincipalArgumentResolverTests {
|
||||
return getMethodParameter("showUserCustomAnnotation", CustomUserPrincipal.class);
|
||||
}
|
||||
|
||||
private MethodParameter showUserSpel() {
|
||||
return getMethodParameter("showUserSpel", String.class);
|
||||
}
|
||||
|
||||
private MethodParameter showUserSpelCopy() {
|
||||
return getMethodParameter("showUserSpelCopy", CopyUserPrincipal.class);
|
||||
}
|
||||
|
||||
private MethodParameter showUserAnnotationObject() {
|
||||
return getMethodParameter("showUserAnnotation", Object.class);
|
||||
}
|
||||
@@ -223,9 +250,62 @@ public class AuthenticationPrincipalArgumentResolverTests {
|
||||
|
||||
public void showUserAnnotation(@AuthenticationPrincipal Object user) {
|
||||
}
|
||||
|
||||
public void showUserSpel(
|
||||
@AuthenticationPrincipal(expression = "property") String user) {
|
||||
}
|
||||
|
||||
public void showUserSpelCopy(
|
||||
@AuthenticationPrincipal(expression = "new org.springframework.security.web.method.annotation.AuthenticationPrincipalArgumentResolverTests$CopyUserPrincipal(#this)") CopyUserPrincipal user) {
|
||||
}
|
||||
}
|
||||
|
||||
private static class CustomUserPrincipal {
|
||||
static class CustomUserPrincipal {
|
||||
public final String property = "property";
|
||||
}
|
||||
|
||||
static class CopyUserPrincipal {
|
||||
public final String property;
|
||||
|
||||
CopyUserPrincipal(String property) {
|
||||
this.property = property;
|
||||
}
|
||||
|
||||
public CopyUserPrincipal(CopyUserPrincipal toCopy) {
|
||||
this.property = toCopy.property;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
result = prime * result
|
||||
+ ((this.property == null) ? 0 : this.property.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj) {
|
||||
return true;
|
||||
}
|
||||
if (obj == null) {
|
||||
return false;
|
||||
}
|
||||
if (getClass() != obj.getClass()) {
|
||||
return false;
|
||||
}
|
||||
CopyUserPrincipal other = (CopyUserPrincipal) obj;
|
||||
if (this.property == null) {
|
||||
if (other.property != null) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (!this.property.equals(other.property)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
private void setAuthenticationPrincipal(Object principal) {
|
||||
|
||||
Reference in New Issue
Block a user