使用Spring Security中的类字段在注释中表达

时间:2014-11-24 16:43:43

标签: java spring spring-security spring-el

我使用方法级安全性。在类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
}

如何使用此类的字段值为类的方法编写表达式?

2 个答案:

答案 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')")