@ -18,6 +18,9 @@ package org.springframework.security.authorization;
import java.util.ArrayList ;
import java.util.ArrayList ;
import java.util.List ;
import java.util.List ;
import java.util.function.Supplier ;
import org.springframework.security.core.Authentication ;
/ * *
/ * *
* A factory class to create an { @link AuthorizationManager } instances .
* A factory class to create an { @link AuthorizationManager } instances .
@ -55,22 +58,22 @@ public final class AuthorizationManagers {
@SafeVarargs
@SafeVarargs
public static < T > AuthorizationManager < T > anyOf ( AuthorizationDecision allAbstainDefaultDecision ,
public static < T > AuthorizationManager < T > anyOf ( AuthorizationDecision allAbstainDefaultDecision ,
AuthorizationManager < T > . . . managers ) {
AuthorizationManager < T > . . . managers ) {
return ( authentication , object ) - > {
return ( AuthorizationManagerCheckAdapter < T > ) ( authentication , object ) - > {
List < AuthorizationDecision > decision s = new ArrayList < > ( ) ;
List < AuthorizationResult > result s = new ArrayList < > ( ) ;
for ( AuthorizationManager < T > manager : managers ) {
for ( AuthorizationManager < T > manager : managers ) {
AuthorizationDecision decision = manager . check ( authentication , object ) ;
AuthorizationResult result = manager . authorize ( authentication , object ) ;
if ( decision = = null ) {
if ( result = = null ) {
continue ;
continue ;
}
}
if ( decision . isGranted ( ) ) {
if ( result . isGranted ( ) ) {
return decision ;
return result ;
}
}
decisions . add ( decision ) ;
results . add ( result ) ;
}
}
if ( decision s. isEmpty ( ) ) {
if ( result s. isEmpty ( ) ) {
return allAbstainDefaultDecision ;
return allAbstainDefaultDecision ;
}
}
return new CompositeAuthorizationDecision ( false , decision s) ;
return new CompositeAuthorizationDecision ( false , result s) ;
} ;
} ;
}
}
@ -101,22 +104,22 @@ public final class AuthorizationManagers {
@SafeVarargs
@SafeVarargs
public static < T > AuthorizationManager < T > allOf ( AuthorizationDecision allAbstainDefaultDecision ,
public static < T > AuthorizationManager < T > allOf ( AuthorizationDecision allAbstainDefaultDecision ,
AuthorizationManager < T > . . . managers ) {
AuthorizationManager < T > . . . managers ) {
return ( authentication , object ) - > {
return ( AuthorizationManagerCheckAdapter < T > ) ( authentication , object ) - > {
List < AuthorizationDecision > decision s = new ArrayList < > ( ) ;
List < AuthorizationResult > result s = new ArrayList < > ( ) ;
for ( AuthorizationManager < T > manager : managers ) {
for ( AuthorizationManager < T > manager : managers ) {
AuthorizationDecision decision = manager . check ( authentication , object ) ;
AuthorizationResult result = manager . authorize ( authentication , object ) ;
if ( decision = = null ) {
if ( result = = null ) {
continue ;
continue ;
}
}
if ( ! decision . isGranted ( ) ) {
if ( ! result . isGranted ( ) ) {
return decision ;
return result ;
}
}
decisions . add ( decision ) ;
results . add ( result ) ;
}
}
if ( decision s. isEmpty ( ) ) {
if ( result s. isEmpty ( ) ) {
return allAbstainDefaultDecision ;
return allAbstainDefaultDecision ;
}
}
return new CompositeAuthorizationDecision ( true , decision s) ;
return new CompositeAuthorizationDecision ( true , result s) ;
} ;
} ;
}
}
@ -131,11 +134,11 @@ public final class AuthorizationManagers {
* /
* /
public static < T > AuthorizationManager < T > not ( AuthorizationManager < T > manager ) {
public static < T > AuthorizationManager < T > not ( AuthorizationManager < T > manager ) {
return ( authentication , object ) - > {
return ( authentication , object ) - > {
AuthorizationDecision decision = manager . check ( authentication , object ) ;
AuthorizationResult result = manager . authorize ( authentication , object ) ;
if ( decision = = null ) {
if ( result = = null ) {
return null ;
return null ;
}
}
return new NotAuthorizationDecision ( decision ) ;
return new NotAuthorizationDecision ( result ) ;
} ;
} ;
}
}
@ -144,34 +147,53 @@ public final class AuthorizationManagers {
private static final class CompositeAuthorizationDecision extends AuthorizationDecision {
private static final class CompositeAuthorizationDecision extends AuthorizationDecision {
private final List < AuthorizationDecision > decision s ;
private final List < AuthorizationResult > result s ;
private CompositeAuthorizationDecision ( boolean granted , List < AuthorizationDecision > decision s ) {
private CompositeAuthorizationDecision ( boolean granted , List < AuthorizationResult > result s ) {
super ( granted ) ;
super ( granted ) ;
this . decisions = decision s;
this . results = result s;
}
}
@Override
@Override
public String toString ( ) {
public String toString ( ) {
return "CompositeAuthorizationDecision [decision s=" + this . decision s + ']' ;
return "CompositeAuthorizationDecision [result s=" + this . result s + ']' ;
}
}
}
}
private static final class NotAuthorizationDecision extends AuthorizationDecision {
private static final class NotAuthorizationDecision extends AuthorizationDecision {
private final AuthorizationDecision decision ;
private final AuthorizationResult result ;
private NotAuthorizationDecision ( AuthorizationDecision decision ) {
private NotAuthorizationDecision ( AuthorizationResult result ) {
super ( ! decision . isGranted ( ) ) ;
super ( ! result . isGranted ( ) ) ;
this . decision = decision ;
this . result = result ;
}
}
@Override
@Override
public String toString ( ) {
public String toString ( ) {
return "NotAuthorizationDecision [decision =" + this . decision + ']' ;
return "NotAuthorizationDecision [result =" + this . result + ']' ;
}
}
}
}
private interface AuthorizationManagerCheckAdapter < T > extends AuthorizationManager < T > {
@Override
default AuthorizationDecision check ( Supplier < Authentication > authentication , T object ) {
AuthorizationResult result = authorize ( authentication , object ) ;
if ( result = = null ) {
return null ;
}
if ( result instanceof AuthorizationDecision decision ) {
return decision ;
}
throw new IllegalArgumentException (
"please call #authorize or ensure that the result is of type AuthorizationDecision" ) ;
}
AuthorizationResult authorize ( Supplier < Authentication > authentication , T object ) ;
}
}
}