使用Shiro进行Servlet身份验证,是否可以过滤具有某些关键字的URL?

时间:2015-08-31 04:52:30

标签: java tomcat servlets ant shiro

我有一个使用shiro身份验证在tomcat中运行的servlet应用程序。 我的servlet URL看起来像这样

 http://builds/Query/User?which_option=ui_data&which_out=json

上述网址中的 “which_option” 可以采用各种值。 我只想在shiro中验证那些 “which_option = ui_data” 的网址。 我在shiro.ini中使用URL过滤中的正则表达式尝试了以下内容。

[urls]
/Query/User*ui_data* = authcBuilds

但这不起作用。 Shiro URL configuration页面提到网址表达式必须为 URL_Ant_Path_Expression ANT path expression似乎仅适用于匹配文件名,而不是URL字符串的一部分。

还有其他方法(URL正则表达式匹配)吗?否则我必须将我的代码转移到另一个servlet,如

http://builds/Query/UI_Data

并在shiro.ini中使用以下身份验证

[urls]
/Query/UI_Data* = authcBuilds

1 个答案:

答案 0 :(得分:1)

Shiro的AntMacher org.apache.shiro.util.AntMatcher的实现确实与您的URL匹配。

import org.apache.shiro.util.AntPathMatcher;
import org.junit.Test;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

public class AntMatcherTest {

    @Test
    public void match() {
        final AntPathMatcher matcher = new AntPathMatcher();

        assertTrue(matcher.match("/Query/User*ui_data*", "/Query/User?which_option=ui_data"));
    }

    @Test
    public void noMatch() {
        final AntPathMatcher matcher = new AntPathMatcher();

        assertFalse(matcher.match("/Query/User*ui_data*", "/Query/User?which_option="));
    }
}

Shiro的javax.servlet.http.HttpServletRequest实现将URL拆分为多个部分:所有查询字符串都会进入匹配中使用的URL。因此它不会匹配查询参数。

编写自己的FormAuthenticationFilter,您将可以访问ServletRequest来检查查询参数。