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

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


上述网址中的“ which_option”可以采用各种值。
我只想对在shiro中具有“ which_option = ui_data”的URL进行身份验证。
我在shiro.ini中使用正则表达式在URL过滤中尝试了以下操作。

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


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

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

http://builds/Query/UI_Data


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

[urls]
/Query/UI_Data* = authcBuilds

最佳答案

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来检查查询参数。

07-24 09:50
查看更多