Shiro路径模式排除

时间:2014-09-18 00:16:15

标签: java ant guice shiro

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

/rest/...没有通过它,但其他一切都会。

我正在使用Shiro-Guice,因此我的过滤器设置格式为

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

我查看了this question关于Ant路径模式样式,但似乎没有对正则表达式的支持。

2 个答案:

答案 0 :(得分:3)

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

你可以编写自己的自定义shiro过滤器,拒绝在de rest url上进行authrorization。

我不知道它如何在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);
    }
}

答案 1 :(得分:-1)

@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;
}