【问题标题】:Spring filter authorization on request param请求参数上的弹簧过滤器授权
【发布时间】:2018-09-11 22:45:04
【问题描述】:

我有一些控制器,其中一些使用请求映射注释的方法需要 codes 的请求参数(字符串列表) 并且我想授权这些代码列表以检查当前用户是否可以访问列表中的所有代码并对其进行过滤。我想要的是为那些我无法将其应用于 URL 映射的控制器创建一个通用过滤器。有没有办法创建过滤器并将注释应用于某些方法(请求映射)?

另一个问题是可以在会话中保留 600 个代码的列表还是使用 db 调用更合适?我期待这些代码的授权调用频繁(用户可以查看(更频繁),更新(不太频繁)与代码相关的数据)

更新:

例如我有两种方法:

@RequestMapping(value="/getInfo")
public void viewInfo(@RequestParam("codes") List<String> codes)

@RequestMapping(value="/getDetailInfo")
public void getDetailInfo(@RequestParam("codes") List<String> codes)

现在,如果我想验证代码,我必须将验证逻辑放入这两种方法中,我想要编写一个过滤器/拦截器来检查用户是否有权查看列表中的所有代码,我可以将用户 url 映射到拦截我问的请求,是否有一种通用的方法可以在方法上使用来验证代码而不添加 url 映射。

【问题讨论】:

    标签: java spring


    【解决方案1】:

    创建 Spring 过滤器

    这个帖子可能会有所帮助:

    HandlerInterceptor 注册到给定路径模式的示例(上面链接中的完整示例):

    @EnableWebMvc
    @Configuration
    public class WebConfig extends WebMvcConfigurerAdapter {
    
        @Bean
        SessionManager getSessionManager() {
             return new SessionManager();
        }
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(getSessionManager())
            .addPathPatterns("/**")
            .excludePathPatterns("/resources/**", "/login");
         // assuming you put your serve your static files with /resources/ mapping
         // and the pre login page is served with /login mapping
        }
    }
    

    存储函数调用返回的值

    您可以使用Caching 轻松保存您的代码列表(无需将其存储在会话中)。

    这样,第一次调用您的函数以检索代码将访问数据库并保存在缓存中。后续调用不会一直到数据库,而是使用存储在缓存中的值,只要它还活着。

    【讨论】:

    • 同意第二个答案,但对于过滤器,我知道如何创建过滤器但不知道如何将其添加到某些请求映射方法中?
    • 嗨@Haider。我更新了我的答案。在我为第一部分发布的链接中,有一些示例说明如何将过滤器(更准确地说,一个 HandlerInterceptor)限制为路径模式。我复制了答案中的一个例子。希望对您有所帮助!
    猜你喜欢
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    • 2016-05-25
    • 1970-01-01
    • 2013-07-16
    • 2020-12-21
    相关资源
    最近更新 更多