Air*_*iry 2 java spring spring-security
我想使用@PostFilteron 方法返回Optional。
SpringDefaultMethodSecurityExpressionHandler目前无法处理Optional,但我可以制作一个简单的装饰器并将其转换Optional为Stream. GlobalMethodSecurityConfiguration由于我使用的是无法修改的内部框架,如何在不创建新装饰器的情况下注册这样的装饰器。
还有另一种方法可以做到这一点吗?
小智 5
更简单的方法是这样的:
import java.util.Collection;
import java.util.Optional;
import java.util.stream.Stream;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;
import org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler;
import org.springframework.security.access.expression.method.MethodSecurityExpressionHandler;
import org.springframework.stereotype.Service;
@Service
public class AnyTypeMethodSecurityExpressionHandler extends DefaultMethodSecurityExpressionHandler implements MethodSecurityExpressionHandler {
@Override
public Object filter(final Object filterTarget, final Expression filterExpression, final EvaluationContext ctx) {
if (filterTarget instanceof Collection || filterTarget != null && filterTarget.getClass().isArray() || filterTarget instanceof Stream) {
return super.filter(filterTarget, filterExpression, ctx);
}
if (filterTarget instanceof Optional) {
return ((Stream<?>) super.filter(((Optional<?>) filterTarget).stream(), filterExpression, ctx)).findAny();
}
return ((Stream<?>) super.filter(Stream.ofNullable(filterTarget), filterExpression, ctx)).findAny().orElse(null);
}
}
Run Code Online (Sandbox Code Playgroud)
这将处理Optionals 以及普通的 Java 对象(null如果它们被过滤,则生成它们)。
| 归档时间: |
|
| 查看次数: |
369 次 |
| 最近记录: |