Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Shiro路径模式排除_Java_Ant_Guice_Shiro - Fatal编程技术网

Java Shiro路径模式排除

Java Shiro路径模式排除,java,ant,guice,shiro,Java,Ant,Guice,Shiro,在我的shiro应用程序中,我想为除REST之外的所有路径定义一个AuthenticationFilter ie/rest/…不会通过它,但其他的一切都会通过 我使用的是Shiro-Guice,所以我的过滤器设置是 addFilterChain("/rest/**" ,restFilter) addFilterChain("/**", filter) //I want this one to work on everything except my rest filter 我研究了Ant

在我的shiro应用程序中,我想为除REST之外的所有路径定义一个
AuthenticationFilter

ie
/rest/…
不会通过它,但其他的一切都会通过

我使用的是
Shiro-Guice
,所以我的过滤器设置是

addFilterChain("/rest/**" ,restFilter)
addFilterChain("/**", filter)    //I want this one to work on everything except my rest filter

我研究了Ant路径模式样式,但似乎不支持正则表达式

你不能那样做。shiro的工作方式是按照配置的顺序检查过滤器。它首先检查第一个过滤器,如果无法进行身份验证,它将转到下一个过滤器。这方面没有排除模式

您可以编写自己的自定义shiro筛选器,该筛选器将拒绝对de rest url进行身份验证

我不知道它在guice中如何工作,但在shiro.ini中,您可以执行以下操作:

[main]
myfilter = UrlBasedAuthzFilter
restFilter = YourRestFilterClass
[urls]
/rest/** = restFilter
/** = myfilter
和过滤器类:

public class UrlBasedAuthzFilter extends AuthorizationFilter {

    @Override
    public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws IOException {
        if (request.getServletContext().getContextPath().startsWith("/rest"){
            return false;
        }
        return super.isAccessAllowed(request, response, mappedValue);
    }
}
@Bean(“shiroFilter”)
public ShiroFilterFactoryBean工厂(DefaultWebSecurityManager安全管理器){
ShiroFilterFactoryBean factoryBean=新的ShiroFilterFactoryBean();
Map filterMap=newlinkedhashmap();
filterMap.put(“adminLoginFilter”,新的adminLoginFilter());
filterMap.put(“jwtAdminAuthcFilter”,新的jwtAdminAuthcFilter());
setFilters(filterMap);
setSecurityManager(securityManager);
factoryBean.setUnauthorizedUrl(“/401”);
Map filterRuleMap=新建LinkedHashMap();
filterRuleMap.put(“/admin/auth/login”,“adminLoginFilter”);
filterRuleMap.put(“/admin/**”,“jwtAdminAuthcFilter”);
filterRuleMap.put(“/401”,“anon”);
setFilterChainDefinitionMap(filterRuleMap);
返回factoryBean;
}

这样你就可以做到了。您可以将过滤器上的模式匹配器更改为
regexpaternmatcher
,而不是
Ant
匹配器。然后您就可以使用java正则表达式了。不过我还是喜欢你的方式。啊,我没想到。好发现!即使使用默认的
AntPathMatcher
,您所要求的也可以开箱即用。Shiro对过滤链以及链内的过滤器使用策略。请在您的回答中添加解释(一些评论也可以)?只使用代码的答案并不是很有帮助,因为它不能进一步理解问题。即使代码可以工作,没有经验的程序员也不知道为什么,并且会从解释中受益。
@Bean("shiroFilter")
public ShiroFilterFactoryBean factory(DefaultWebSecurityManager securityManager) {
    ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();

    Map<String, Filter> filterMap = new LinkedHashMap<>();
    filterMap.put("adminLoginFilter", new AdminLoginFilter());
    filterMap.put("jwtAdminAuthcFilter", new JwtAdminAuthcFilter());
    factoryBean.setFilters(filterMap);

    factoryBean.setSecurityManager(securityManager);
    factoryBean.setUnauthorizedUrl("/401");

    Map<String, String> filterRuleMap = new LinkedHashMap<>();
    filterRuleMap.put("/admin/auth/login","adminLoginFilter");
    filterRuleMap.put("/admin/**", "jwtAdminAuthcFilter");
    filterRuleMap.put("/401", "anon");

    factoryBean.setFilterChainDefinitionMap(filterRuleMap);
    return factoryBean;
}