希望创建一个自定义实现来授权请求。
我正在评估选项以避免在控制器中的每个方法上使用注释。 相反,我正在探索通过过滤器集中此功能的可能性,该过滤器检查登录用户是否具有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代码但尚未找到方法。
答案 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
在控制器的父类等上注释。