Spring MVC自定义授权/安全性的控制器方法

时间:2014-05-09 21:43:15

标签: java spring spring-mvc spring-security

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

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

我们正在使用Spring 3.2.5.RELEASE

我打算创建一个数据库表,其中包含权限和相关URL之间的映射。

我正在寻找获取当前网址的请求映射信息的方法。

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

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

如果当前网址为:

    /app/user/view/1

,用

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

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

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

我看过/正在查看有关SO的相关帖子,并且还查看了Spring代码但尚未找到方法。

1 个答案:

答案 0 :(得分:1)

如果你想这样做,你可以注册MVC拦截器而不是servlet过滤器。 创建一个扩展HandlerInterceptorAdapter的类,在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在控制器的父类等上注释。