dwr+spring security在方法权限判断失败后的一个问题

来源:互联网 发布:淘宝分销卖什么好 编辑:程序博客网 时间:2024/05/29 09:05

简单记录一下,debug了N久代码,还是尚未彻底搞明白这个问题,只是懵懵懂懂,servlet的代码进不去了,ss的代码倒是没发现什么情况,反而在cglib的代码中,看到不少非主流的情况。

 

现象: dwr异步请求过程中,调用了一个具有权限控制的代码,调用这个代码需要特定的角色才可以,通过判断,当前的用户并不具有这个权限,所以不允许被调用,按照ss的习惯,应该是抛出一个Access 拒绝的异常,然后通过匹配403的相关配置定位到错误页面或者在本页面显示错误信息。但是现在的情况是,权限检查失败,在页面直接alert了一个ERROR的错误,通过查阅dwr的engine.js后发现这个是dwr点errorHandler方法中弹出的,情况是当出现异常的时候。

dwr调用异步返回点是xml信息,这个xml解析后可以拿到相应的结果,但是在ss校验失败的过程中,代码并未执行,而是ss由于需要定位到错误页面,返回了一个字符串之类的,导致dwr发生异常。(?????????????真的么???)

解决办法也还是有的,只是需要重写dwr的errorHandler方法,在其内部处理当抛出异常的情形。同时在dwr中声明一下异常的类型

 

<convert converter="bean" match="org.springframework.security.AccessDeniedException"/>

 

暂时可以用这个方案解决。

 

目前系统采用的安全控制有三层,第一层是页面渲染的时候,用户不具有权限点菜单将被隐藏;第二层是由于目前的后台是富客户端类型点,ajax和js等代码丰富,所以js中进行了第二次的权限判断,这个由于是在客户端进行的,所以不会带来额外的压力。最后一层是由于富客户端的请求都是异步而非url的,所以不能通过拦截url的方式让ss自动执行,所以需要在方法层面上进行控制,在dwr点bean的方法之上,配置了权限相关内容。