- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要发明一种新型注释,其中一个字段是 Spring 表达式语言(又名 SpEL)表达式字符串。
经过一番谷歌搜索和检查现有的类后,我发现评估表达式的方式可能是这样的(如果我有任何错误,请纠正我):
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("isAnonymous()"); // well, this is only an example
SecurityExpressionRoot context = ... obtaining the instance of subclass of SecurityExpressionRoot ...
System.out.println(exp.getValue(context)); // just an example
但问题是:最适合我的情况 MethodSecurityExpressionRoot 是 package-local。甚至还有一个task about making it public in Spring Security JIRA一年来没有引起开发人员的任何关注。
即使它不是包本地的,我仍然对从哪里获取方法对象的理解很薄弱setTrustResolver
, setRoleHierarchy
和setPermissionEvaluator
的SecurityExpressionRoot
类,这似乎是其正常运行所必需的。
所以,我的问题是:如何正确获得正确的SecurityExpressionRoot
-子类实例以及如何用所需的对象填充它?
最佳答案
我正在解决同样的问题。我有一个菜单项列表。每个菜单项都包含一个安全表达式字符串 (SpEl)。我尝试使用 @PostFilter("filterObject.securityExpression") 但我不知道如何计算 SpEl 字符串内的 SpEl 字符串。
所以我最终得到了自定义评估器 bean。深受 org.thymeleaf.extras.springsecurity4.auth.AuthUtils 的启发
评估器使用与 Web 安全过滤器相同的 SecurityExpressionHandler。这意味着有必要为评估上下文提供请求和响应。但这应该不会很复杂,因为 Spring 将这些值注入(inject)到 Controller 方法中。
评估者:
@Component
public class WebSecurityExpressionEvaluator {
private static final FilterChain EMPTY_CHAIN = (request, response) -> {
throw new UnsupportedOperationException();
};
private final List<SecurityExpressionHandler> securityExpressionHandlers;
public WebSecurityExpressionEvaluator(List<SecurityExpressionHandler> securityExpressionHandlers) {
this.securityExpressionHandlers = securityExpressionHandlers;
}
public boolean evaluate(String securityExpression, HttpServletRequest request, HttpServletResponse response) {
SecurityExpressionHandler handler = getFilterSecurityHandler();
Expression expression = handler.getExpressionParser().parseExpression(securityExpression);
EvaluationContext evaluationContext = createEvaluationContext(handler, request, response);
return ExpressionUtils.evaluateAsBoolean(expression, evaluationContext);
}
@SuppressWarnings("unchecked")
private EvaluationContext createEvaluationContext(SecurityExpressionHandler handler, HttpServletRequest request, HttpServletResponse response) {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
FilterInvocation filterInvocation = new FilterInvocation(request, response, EMPTY_CHAIN);
return handler.createEvaluationContext(authentication, filterInvocation);
}
private SecurityExpressionHandler getFilterSecurityHandler() {
return securityExpressionHandlers.stream()
.filter(handler -> FilterInvocation.class.equals(GenericTypeResolver.resolveTypeArgument(handler.getClass(), SecurityExpressionHandler.class)))
.findAny()
.orElseThrow(() -> new IllegalStateException("No filter invocation security expression handler has been found! Handlers: " + securityExpressionHandlers.size()));
}
}
用作 Controller 方法:
@ModelAttribute("adminMenuItems")
public List<AdminMenuItem> getMenuItems(HttpServletRequest request, HttpServletResponse response) {
List<AdminMenuItem> menuItems = ...
return menuItems.stream().filter(item -> evaluator.evaluate(item.getSecurityExpression(), request, response)).collect(toList());
}
关于spring - 如何评估自定义 java 代码中的 SpEL 安全表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17263506/
我正在尝试使用 spring SpEL 来解析在 UDP 中收到的消息。 为了理解如何使用 Spring SpEL,我写了这个: 上下文.xml:
我想将 xml 文件中分配的属性值传递给 Java 中的 Spring 表达式(SpEL)。你能指出我如何实现这一目标吗?为了清楚起见,我提供了以下示例。 example.xml 文件:
我正在尝试将 spring 版本从 3.0.5 升级到 3.2.11。 当表达式比较空值时,我遇到了 SpEL 的麻烦,如下所示: new SpelExpressionParser().parseEx
例如,我在 Spring boot 的 application.yml 中有一个属性。 some: strNumber: "5" 我想以此属性的某些其他属性的值(value)为基础。例如 some
我试图从属性中获取一个字符串,对其运行操作,然后将其存储为带有 @Value 注释的变量。不幸的是,当我使用 SpEL 所需的 #{'${variable}'} 语法时,字符串发生了变化。如果我有两个
在我的应用程序中,我有一些带有多个 SpEL 表达式的对象,这些表达式通常包含带有 boolean 返回类型以调用和逻辑运算符的方法签名。在缓存这些对象之前,我通过简单地执行已解析的表达式来检查表达式
我正在尝试在 Spring 集成流程中构建一个 url,如下所示: 但是我不断收到以下错误: SpelParseException: EL1041E:(pos 9): After parsing a
我想根据某些条件导入不同的资源文件。这可能吗? 这些不起作用: 最佳答案 支持 SpEL,但 Spring 很早就解析了 import 语句。 spring 在解析 import 语句时,属性占位
我有一个类的方法:代码: List getData() {...} 和一些扩展实体的类:项目、阶段、发票、付款。 我想做这样的事情: @PostFilter("filterObject instans
我正在尝试计算以下 SpEL 表达式(Spring 表达式版本 3.1.1): T(com.google.common.collect.Lists).newArrayList(#iterable) #
作为我项目的一部分,我正在实现一个基于 SpEL 的规则引擎,我正在努力使其尽可能高效。基本上,该引擎由 SpEL 语法中的持久条件组成。当需要评估输入时,我会在数据库中查询相关规则 - SpEL 表
就 Spring 3.0 中使用的 SpEL 而言, 我想问一下,是否可以执行以下操作(在 bean 定义 .xml 中): 东西。就像在jSTL中一样。
我是法国人,所以我放了一些 é è ê ô û 在我的代码中。 (而且我的英语说得不是很好)。 我在类 Formulaires 中有一个类似的方法: public static Formulair
我发现一篇文章Open source library with vulnerabilities . 这篇文章指出“Spring 表达式语言 (SpEL) 可以通过 HTTP 参数提交来利用,从而允许攻
我遇到了一个问题,我尝试监听EnvironmentChangeEvent并重新初始化一些配置。 虽然我发现 SpEL 的 @Value 注释不起作用,但普通的 @Value 注释就可以了: @Comp
给定 java.util.Date() ,如何使用 Spring 表达式语言创建 Calendar 对象? 这个有效: 但我需要从 java.util.Date() 向其构造函数提供日、月和年。我有
是否有某个地方有带有 Spring 表达式语言 shell 的 swing 控制台? 最佳答案 据我所知,没有控制台或命令行评估器,但我建议您下载 org.springframework.expres
我想在 application.properties 中计算我的端口号,如下所示: server.port=#{ 1 + ${myapp.web.server.port.ssl} } myapp.we
我要评估 "user.name" 但是 user 可能为 null,这当然会导致 NPE 有没有办法说仅在 user 不为 null 时才尝试获取名称?否则返回 null。 我读过有关 Elvis 语
我需要知道 Spring SpEL 在语法和功能方面是否有限制。例如我需要运行这个表达式: Integer cnt=0; if(obj.val1<10){return 1;} else{ cnt=cn
我是一名优秀的程序员,十分优秀!