我希望能够记录我的应用收到的未经授权的请求。因为Shiro插件使用HTTP重定向将用户发送到auth/unauthorized
,所以请求对象是新的,我无法获取原始URL;控制器/动作名称;或者从中请求参数。
有没有办法在AuthController未经授权的操作中确定原始网址或控制器和操作名称(如果可能请求参数)?
我将http://plugins.grails.org/grails-shiro/tags/RELEASE_1_1_3/ShiroGrailsPlugin.groovy视为插件来源的参考。
详细说明:
Grails 1.3.7
Shiro Grails插件1.1.3
答案 0 :(得分:2)
我遇到了同样的问题......我的解决方案并不完美:
浏览器在其中一个标题中发送所谓的referer,您可以通过该标题获取
request?.getHeader('Referer')
但是引用者并不是你真正可以依赖的 - 但是大多数浏览器都会发送它。
另一种解决方案可能是过滤器:在accessControl()
中调用ShiroSecurityFilters.groovy
之前,尝试将当前网址写入另一个变量。您可以通过request.forwardURI
获取当前网址。
更新:刚刚验证了我的最后一个假设 - 这对我来说似乎是最干净的解决方案:
在ShiroSecurityFilters.groovy
中,替换
// Access control by convention.
accessControl()
与
// Access control by convention.
if (!accessControl()) {
session.deniedUrl = request.forwardURI
return false
}
可让您在身份验证/未授权控制器中以session.deniedUrl
的形式访问网址。