我使用方法级安全性。在类I中注释了一些方法,表达式使用了这个类的字段。但我看到SpEL例外,我无法引用它们。 这是这个类的代码的一部分。在表达式中我想使用字段repPrefix,但我收到异常,它是一个未知变量。
@Component("c2rTableManager")
@Scope("prototype")
public class C2RTableManager implements TableManager {
private final TableManager tableManager;
private final String repPrefix;
@Autowired
private SecurityInfoService securityInfoService;
public C2RTableManager(TableManager tableManager, String repository) {
this.tableManager = tableManager;
this.repPrefix = repository + "__";
}
...some methods
@Override
@PreAuthorize("hasRole('DBA') || hasPermission(repPrefix + #table, 'TABLE', 'DELETE_TABLE')")
public void dropTable(String table) throws InterruptedException, IOException {
tableManager.dropTable(table);
}
...other methods
}
如果我写另一种方式,表达式AREN&T 39评估完全。无法理解原因。
@Component("c2rTableManager")
@Scope("prototype")
public class C2RTableManager implements TableManager {
private final TableManager tableManager;
private final String repPrefix;
@Autowired
private SecurityInfoService securityInfoService;
public C2RTableManager(TableManager tableManager, String repository) {
this.tableManager = tableManager;
this.repPrefix = repository + "__";
}
...some methods
@Override
public void dropTable(String table) throws InterruptedException, IOException {
dropTable(table, repPrefix);
}
@PreAuthorize("hasRole('DBA') || hasPermission(#repPrefix + #table, 'TABLE', 'DELETE_TABLE')")
public void dropTable(String table, String repPrefix) throws InterruptedException, IOException {
tableManager.dropTable(table);
}
...other methods
}
如何使用此类的字段值为类的方法编写表达式?
答案 0 :(得分:0)
我没有足够的声誉来添加评论。 来自http://docs.spring.io/spring-security/site/docs/3.0.x/reference/el-access.html
的Spring Security文档这里我们实际上使用方法参数作为表达式的一部分 判断当前用户是否具有“admin”权限 给予联系。内置的hasPermission()表达式被链接到 Spring Security ACL模块通过应用程序上下文,如 我们将在下面看到。您可以按名称访问任何方法参数 表达式变量,只要您的代码具有调试信息 汇编成。
请强调最后一句话。检查以下两点:
<global-method-security pre-post-annotations="enabled"/>
答案 1 :(得分:0)
我需要宣布bield为public
private final String repPrefix;
并编写带有此链接的注释
@PreAuthorize("hasRole('DBA') || hasPermission(repPrefix + #table, 'TABLE', 'DELETE_TABLE')")