通用控制器中hasPermission的参数 - java

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

@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());
}

我在注释PreAuthorize时遇到问题。许可的名称具有以下结构:_。现在,当我尝试访问该方法映射的视图时,出现403错误。我还尝试了其他变化,例如:

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

要么

@PreAuthorize("hasPermission(#user, 'cadastra_#this.getClass().getName()')")

但结果相同。有人知道实现此目标的正确方法吗?

更新

我尝试在此标签PreAuthorize保护的控制器的方法内部调用此函数:

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);
    }

}

参考方案

因此,您很难在SpEL表达式中以[methodName] _ [classFullName]的形式动态构造权限名称。

请参阅下面的SpEL文档关于#this变量的说明

始终定义变量#this并引用当前评估对象
(针对哪些不合格的引用已解决)。

根据文档并在代码中稍加挖掘,#this表示的实际对象在您的情况下应为org.springframework.security.access.expression.method.MethodSecurityExpressionRoot类的实例。该类包含一些有用的方法,其中getThis()方法还返回目标对象,在该对象上调用安全方法(用@PreAuthorize注释的方法)。

掌握了这些知识之后,构建所需的表达式就不会有什么大不了的了。如果方法名为“ cadastra”,则应如下所示。

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

希望它也可以对从基类继承的安全方法正常工作。

Spring Boot如何在POST之后返回响应 - java

我想创建一个新客户并在创建客户后返回客户编号。客户编号必须是从50000开始的自动递增的唯一编号。到目前为止,我已经成功创建了一个客户,但是我不确定应该如何生成客户编号,将其保存到数据库中,并在触发POST时将其作为成功消息显示给用户。json下面是所需的响应;{ "customerNumber": "50002", …

春天的多属性文件 - java

我在spring中加载属性文件: <context:property-placeholder location="classpath:foo.properties"/> 但是,如果我尝试在另一个上下文文件中加载另一个文件,则会出现错误。 java大神给出的解决方案 如果您需要覆盖属性,则可以执行以下操作:<context…

IntelliJ Spring MVC教程部署 - java

我尝试了tutorial,当我尝试部署webapp(IntelliJ 13.1.4 Ultimate)时,出现了一个奇怪的错误,如下面的屏幕快照所示。解决此错误的方法是什么? org.jdom.input.JDOMParseException: Error on line 742: The content of elements must consist o…

春季安全值得付出努力 - java

我一直在关注春季安全性,并注意到它是多么大的包装。我想知道是否值得花一些时间来加强这一点。Spring Security 2.0+为您节省了大量时间,还是以任何方式简化了您的项目? java参考方案 几年前,我考虑将其用于Spring项目,并选择了它,因为它是一个非常繁琐的框架,恕我直言,它提供的灵活性不是必需的。 (据我估计)减少我们自己的身份验证/授权的…

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…