【问题标题】:Spring MVC custom authorization/security for controller methods控制器方法的 Spring MVC 自定义授权/安全性
【发布时间】:2014-05-12 22:51:17
【问题描述】:

希望创建自定义实现来授权请求​​。

我正在评估选项以避免在控制器中的每个方法上使用注释。 相反,我正在探索通过检查登录用户是否具有 URL 所需权限的过滤器来集中此功能的可能性

我们正在使用 Spring 3.2.5.RELEASE

我打算创建一个在权限和相关 URL 之间具有映射关系的数据库表。

我正在寻找一种方法来获取当前 URL 的请求映射信息。

对于 E-g : 在我的数据库中,我有:

    URL=/view/{id} , permission=VIEW_USER

如果当前网址是:

    /app/user/view/1

,用

注释的方法
    @RequestMapping(value = "/view/{id}", method = RequestMethod.GET)

将被调用。但在此之前,我需要验证登录用户是否有权查看用户详细信息。

在我的过滤器中,我可以得到当前的URL(/app/user/view/1),我如何得到对应的映射(/view/{id})?是否有一种机制可以将 URL 与其对应的 MVC 请求映射相匹配?

我已经查看/正在查看 SO 上的相关帖子,还查看了 Spring 代码,但还没有找到方法。

【问题讨论】:

    标签: java spring spring-mvc spring-security


    【解决方案1】:

    如果你想这样做,你可以注册 MVC 拦截器而不是 servlet 过滤器。 创建一个扩展 HandlerInterceptorAdapter 的类,在 preHandle 方法中,您将可以访问控制器的方法及其注释。拦截器的 Prehandle 方法可能如下所示:

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (handler instanceof HandlerMethod) {
            HandlerMethod method = (HandlerMethod) handler;
            if (method.getMethod().isAnnotationPresent(RequestMapping.class)) {
                RequestMapping rqm = method.getMethodAnnotation(RequestMapping.class);
                String[] urlMappings = rqm.value();
                //do security logic
            }
        }
        ...
    }
    

    然后你需要注册拦截器。如果你使用 xml 配置它是这样完成的:

    <mvc:interceptors>
      <bean class="com.example.MySecurityInterceptor" />
      ...
    </mvc:interceptors>
    

    请注意,您的方法会很困难,您需要处理 spring 支持的所有请求映射案例。例如,@RequestMapping 在类级别上进行了注释。或者@RequestMapping注解在控制器的父类等上。

    【讨论】:

    • 感谢您的意见。你对处理不同的情况提出了很好的观点。如果我能弄清楚如何将 URL 与其相应的请求映射相匹配,我也许可以做一些事情。 Spring MVC 必须做到这一点。必须有一种机制将 URL 与请求映射相匹配,以便调用控制器方法,如果我能弄清楚这可能会有所帮助。
    猜你喜欢
    • 2015-10-01
    • 1970-01-01
    • 2023-03-05
    • 2012-11-25
    • 2015-03-03
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    • 2016-03-07
    相关资源
    最近更新 更多