我正在尝试实现一个通用控制器类,其中每个方法的结构都类似于此:
@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…