【问题标题】:Shiro Path Pattern excludeShiro 路径模式排除
【发布时间】:2014-11-12 04:23:09
【问题描述】:

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

ie /rest/... 不会通过它,但其他一切都会。

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

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

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

【问题讨论】:

  • 即使使用默认 AntPathMatcher,您所要求的内容也可以开箱即用。 Shiro 对过滤器链以及链内的过滤器使用first match wins 策略。

标签: java ant guice shiro


【解决方案1】:

你不能那样做。 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);
    }
}

【讨论】:

  • 所以事实证明你可以做到。您可以将过滤器上的模式匹配器更改为 RegexPatternMatcher 而不是 Ant 匹配器。然后你可以只使用 java 正则表达式。不过我还是更喜欢你的方式。
  • 啊,我没想到。很好的发现!
【解决方案2】:
@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;
}

【讨论】:

  • 您能否在您的答案中添加一个解释(一些 cmets 也会这样做)?仅代码的答案并不是很有帮助,因为它不会进一步理解问题。即使代码有效,没有经验的程序员也不知道为什么,并且会从解释中受益。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-17
  • 2014-11-06
  • 1970-01-01
相关资源
最近更新 更多