Kle*_*ota 2 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("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()')")
但结果相同.谁知道正确的方法来实现这一目标?
UPDATE
我尝试在这个标签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)")
希望它对于从基类继承的安全方法也能正常工作.
| 归档时间: | 
 | 
| 查看次数: | 1455 次 | 
| 最近记录: |