Java 泛型控制器中hasPermission的参数

Java 泛型控制器中hasPermission的参数,java,spring,spring-security,spring-el,Java,Spring,Spring Security,Spring El,我正在尝试实现一个通用控制器类,其中每个方法的结构类似于: @RequestMapping(value="cadastra") @PreAuthorize("hasPermission(#user, 'cadastra_#this.class.name')") public ModelAndView cadastra() throws InstantiationException, IllegalAccessException { return new ModelAndView("pri

我正在尝试实现一个通用控制器类,其中每个方法的结构类似于:

@RequestMapping(value="cadastra")
@PreAuthorize("hasPermission(#user, 'cadastra_#this.class.name')")
public ModelAndView cadastra() throws InstantiationException, IllegalAccessException {
    return new ModelAndView("privado/"+this.entity.getClass().getName()+"/cadastra", "command", this.entity.getClass().newInstance());
}
我在注释
预授权
方面遇到问题。权限的名称具有以下结构:\ u0。现在,当我尝试访问该方法映射的视图时,遇到403错误。我还尝试了其他变体,如:

@PreAuthorize("hasPermission(#user, 'cadastra_'+#this.class.name)")

但结果是一样的。有人知道实现这一目标的正确方法吗

更新

我尝试在由此标记预授权保护的控制器中的方法内调用此函数:

private void expressionParser() {
    System.out.println("expressionHandler()");
    ExpressionParser parser = new SpelExpressionParser();
    Expression expression = parser.parseExpression("'cadastra_'+#this.class.name");
    String message = (String) expression.getValue();
    System.out.println("Message is " + message);
}
当我运行应用程序并打开视图时,视图应通过控制器中的方法进行映射,如下所示:

@RequestMapping(value="cadastra")
@PreAuthorize("hasPermission(#user, 'cadastra_'+#this.class.name)")
public ModelAndView cadastra() throws InstantiationException, IllegalAccessException {
    this.expressionParser();
    return new ModelAndView("privado/"+this.entityClass.getName()+"/cadastra", "command", this.entityClass.newInstance());
}
控制台上不显示任何消息。因此,我认为我的应用程序没有从我的泛型控制器调用方法。我说得对吗?如果是,我如何解决这个问题

我的衍生控制器遵循以下结构:

@Controller
@RequestMapping(value="usuario")
public class UsuarioController extends controller<Usuario> {

    public UsuarioController() {
        super(Usuario.class);
    }

}
@控制器
@请求映射(value=“usuario”)
公共类控制器扩展控制器{
公共财务总监(){
超级(Usuario.class);
}
}

因此,在SpEL表达式中以[methodName].[classFullName]的形式动态构造权限名称时会遇到困难

请参见下面的SpEL文档中关于此变量的说明

变量#始终定义并引用当前评估对象 (不符合条件的引用被解决)

根据文档和对代码的一些挖掘,在您的例子中,#它所代表的实际对象应该是
org.springframework.security.access.expression.method.MethodSecurityExpressionRoot
类的实例。该类包含几个有用的方法,其中还包括
getThis()
方法,该方法返回调用安全方法(用
@PreAuthorize
注释的方法)的目标对象

有了这些知识,构建所需的表达式应该不是什么大问题。对于名为“地籍”的方法,应如下所示

@PreAuthorize("hasPermission(#user, 'cadastra_'+#this.this.class.name)")

希望它对于从基类继承的安全方法也能正常工作

所以,我用这种方法解决了这个问题:

1) 将新方法添加到我的泛型控制器,其中我返回类的名称:

public String getName() {
    String expressao = entityClass.getName();
    String nome_classe = new String();
    StringTokenizer st = new StringTokenizer(expressao, ".");
    while (st.hasMoreTokens()) {
        nome_classe = st.nextToken();
    }
    return nome_classe;
}
2) 在注释中,我使用此方法返回的值并将结果与常量字符串连接(使用本主题中用户@pgjecek描述的符号):


现在它工作得很好。

权限的格式应该是[methodName]U1;[classFullName]?您可以添加与访问控制相关的Spring安全配置吗?是的,这是权限的格式。spring安全配置如下所示:
public String getName() {
    String expressao = entityClass.getName();
    String nome_classe = new String();
    StringTokenizer st = new StringTokenizer(expressao, ".");
    while (st.hasMoreTokens()) {
        nome_classe = st.nextToken();
    }
    return nome_classe;
}
@PreAuthorize("hasPermission(#user, 'cadastra_'+#this.this.name)")