【问题标题】:How to filter request based on domain in spring-mvc如何在spring-mvc中基于域过滤请求
【发布时间】:2017-05-06 07:01:56
【问题描述】:

我的应用程序有一个 war 文件,我将使用 2 个域来访问它。例如,我想使用 admin.mydomain.com/adminpage 访问 admin.jsp 以及我想使用 local.mydomain.com 访问的其他 jsp 页面。

此外,admin.jsp 应该只能通过 admin.mydomain.com 而不是 local.mydomain.com 访问。如何在 spring-security / spring-mvc 中做到这一点? spring 框架对此有支持吗?

对此的任何帮助都会有所帮助。谢谢。

【问题讨论】:

    标签: spring spring-mvc spring-security


    【解决方案1】:

    你可以实现RequestMatcher,也许像

    HostOnlyRequestMatch(String relativePath, String hostname)
    

    然后重写boolean matches(HttpServletRequest request)方法,如果relativePathhostname与request相同,则返回true

    像这样将requestMatcher 添加到http

     http
         .authorizeRequests()
             .requestMatcher(new HostOnlyRequestMatch("/admin", "admin.mydomain.com")).permitAll()
             .antMatchers("/admin").denyAll();
    

    【讨论】:

      【解决方案2】:

      一种方法是配置代理(例如 Nginx)以正确地将您的请求路由到您的应用程序服务器(例如 Tomcat)。阅读此处了解更多详情https://www.nginx.com/resources/admin-guide/reverse-proxy/

      【讨论】:

        【解决方案3】:

        您可以从 mvc 控制器中的请求对象获取请求的 url,如果它不是正确的域,那么您可以根据您的项目抛出或显示正确的错误。以下是代码sn -p

        @Controller
        @RequestMapping("/adminpage")
        public class AdminPageController{
        
           @RequestMapping(method = RequestMethod.GET)
           public String getAdminPage(HttpServletRequest request) {
              String url = request.getRequestURL().toString();
              if(!url.contains("admin.mydomain.com")) {
                  throw RuntimeException("Not accessible through this domain.");
                  // You can implement your own logic of showing error here
              }
           }
        }
        

        【讨论】:

        • 安全是一个跨领域的问题,不应该在控制器中实现! Spring Security、HandlerInterceptor 或 @ControllerAdvice 都是更好的机制。
        猜你喜欢
        • 2021-09-17
        • 2018-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-05
        • 2016-01-04
        • 1970-01-01
        相关资源
        最近更新 更多