覆盖Shiro中的Authentication类与Guice的绑定

时间:2015-07-29 16:32:13

标签: angularjs web-services guice shiro

我遇到的问题与类型消息有关:

OPTIONS http://localhost:8080
XMLHttpRequest cannot load http://localhost:8080/. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access. The response had HTTP status code 401.

所以基本上这是我们的Angular JS 1.4.3前端在实际请求之前向服务器发送OPTIONS请求的问题。出现问题,因为无法向此请求添加身份验证数据,并且Apache Shiro在尝试访问受保护的地址时会阻止它。

由于我无法在Angular端修复它,我认为在服务器端很容易。是的,但我们使用 Guice 4

在Guice配置中,我们正确设置了Shiro:

install(new EEShiroModule(getServletContext()));
filter("/services/*").through(GuiceShiroFilter.class);
到目前为止一切顺利。但是现在我想在系统中打个洞,允许OPTIONS请求不被认证。我在这里找到了类似的方法:http://blog.awolski.com/cors-dart-dropwizard-and-shiro/

最后我应该覆盖 BasicHttpAuthenticationFilter,但它不像Spring或Ini配置那么简单,因为我无法覆盖类绑定。

最好的方法是什么?谢谢!

1 个答案:

答案 0 :(得分:1)

今天我遇到了类似的问题。对于CORS请求,由于浏览器无法向OPTIONS请求添加自定义标头,因此Apache Shiro会将OPTIONS飞行前请求视为未经身份验证。

解决这个问题。我覆盖了AuthenticatingFilter的{​​{1}}方法,以便在请求的方法为isAccessAllowed时始终返回true。

OPTIONS

如果您使用的是public class CORSAuthenticationFilter extends AuthenticatingFilter { @Override protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) { //Always return true if the request's method is OPTIONS if(request instanceof HttpServletRequest){ if(((HttpServletRequest) request).getMethod().toUpperCase().equals("OPTIONS")){ return true; } } return super.isAccessAllowed(request, response, mappedValue); } } ,则还需要覆盖它。

PermissionsAuthorizationFilter

重写这些过滤器后。应该声明它们是shiro配置文件中正在运行的实现。

这就是我如何让事情发挥作用。希望它有所帮助,但有点晚了。