当前位置: 首页 > 知识库问答 >
问题:

用Guice覆盖Shiro中身份验证类的绑定

辛成周
2023-03-14

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

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前端在实际请求之前向服务器发送<code>选项

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

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

install(new EEShiroModule(getServletContext()));
filter("/services/*").through(GuiceShiroFilter.class);

到目前为止一切顺利。但是现在我想在系统中打一个洞,允许< code>OPTIONS请求不被验证。我在这里发现了一个类似的方法:http://blog.awolski.com/cors-dart-dropwizard-and-shiro/.

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

最好的方法是什么?谢谢

共有1个答案

慕容恩
2023-03-14

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

为了解决这个问题。我重写了AuthentiatingFilterisAccess准许方法,使其在请求的方法为OPTIONS时始终返回true。

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);
    }
}

如果您正在使用< code > permissions authorizationfilter ,您也需要覆盖它。

public class CORSPermissionAuthorizationFilter extends PermissionsAuthorizationFilter {

    @Override
    public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws IOException {
        if(request instanceof HttpServletRequest){
            if(((HttpServletRequest) request).getMethod().toUpperCase().equals("OPTIONS")){
                return true;
            }
        }
        return super.isAccessAllowed(request, response, mappedValue);
    }
}

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

这就是我做事的方式。希望有帮助,不过有点晚了。

 类似资料:
  • 我正在开发一个Web应用程序,它是rest客户端并使用rest服务(API)来执行任何操作。我集成了apache shiro以使用工作正常的jdbc领域执行身份验证。 现在,我正在寻找一种使用apacheDS LDAP执行身份验证的解决方案。我计划使用kerberos身份验证,但我没有找到任何有用的文章或示例来使用apache shiro实现kerberos身份验证。 我发现apache shir

  • 因此,我需要找到一些使用ServletRequest和ServletResponse参数的身份验证方法。 但是,我仍然没有找到这样的ProcessingFilter或AuthenticationProvider。 根据Spring Security basic,我似乎必须重写与AuthenticationProvider相关的authenticate方法。 谢了。

  • 我是Apache Shiro的初学者。我一直在跟踪文档和许多其他教程,博客等,但我就是无法使身份验证工作。当我尝试使用有效的用户名和密码登录时,总是会引发。我正在使用DynamoDB作为存储用户凭据的自定义领域,但我真的不认为这有什么关系。显然,我存储和/或执行凭据匹配的方式是不正确的。以下是我的设置:

  • 我在我的网站中使用默认的route。php。 此路由复制的“照明/路由/路由器”。php’。 我用它来改变默认路线和。。。在 什么是?? 我应该在路线组中的何处定义它? 谢谢你的帮助。

  • 我有一个已经完成的j2ee(jsf、cdi、jpa)应用程序,它完美地使用了ApacheShiro,它工作得非常好,我喜欢Shiro注释(hasRole、hasPermission等)。 现在,该项目还必须能够通过SiteMinder进行身份验证,我的问题是: 我如何设置一个领域来处理SiteMinder身份验证而不丢失Shiro授权(似乎SiteMinder会在HTTP头中给我用户名和Rolen

  • 我有几个测试用例,有一个测试用例我想测试通知不可用。我使用了一个单独的将通知服务实例注入(覆盖)为,而不是通常的 它不起作用,因为 依赖于 Play 在此测试的启动生命周期中注入的其他模块。如何加载这些 Play 默认模块,以便 适用于此测试用例?有没有更好的方法可以做到这一点?谢谢