Shiro使用HTTP Basic Auth或匿名访问相同的URI

时间:2014-08-19 19:51:41

标签: java authentication basic-authentication shiro

我在/ api下有一组API。如果我的shiro.ini将其列为:

/api/** = authcBasic

然后需要基本身份验证。如果存在anon代替authcBasic,则不需要auth。我希望能够将API与基本身份验证一起使用,因此我可以以编程方式检查用户是否已对POST进行身份验证,但仍允许匿名访问同一URI上的GET。或者,为匿名用户隐藏相同URI的受限数据,并将其显示给身份验证的用户。

这可能吗?

3 个答案:

答案 0 :(得分:3)

您可以滚动自己的自定义shiro过滤器。扩展类BasicHttpAuthenticationFilter并覆盖onPreHandle,您可以在其中检查servlet请求方法(如果它是GET或POST)并对其进行操作。

类似于:

public class MyFilter extends BasicHttpAuthenticationFilter {

    @Override
    protected boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) {
        if ("GET".equals((HttpServletRequest)request).getMethod()){
            return true;
        }
        return super.onPreHandle(request, response, mappedValue);
    }

}

在shiro.ini中:

[main]
myfilter = mypackage.MyFilter

[urls]
/api/** = myfilter

答案 1 :(得分:1)

我认为这很有效。

    @Override
protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
    boolean loggedIn = false; //false by default or we wouldn't be in this method
    if (isLoginAttempt(request, response)) {
        loggedIn = executeLogin(request, response);
    }
    if (!loggedIn) {
//            sendChallenge(request, response);
            return true;
    }
    return loggedIn;
}

即。如果提供授权详细信息,则执行正常登录(如果auth详细信息无效,则为401),否则仍然允许它们(然后检查是否经过身份验证,稍后授权)。

这个方法有一个警告,虽然它适用于curl测试,但使用Apache的HttpClient Fluent API似乎在未经授权的情况下发送请求,然后在质询响应后发送带有凭据的第二个请求,我们显然现在不发送。可以说是HttpClient中的一个错误,但看到我们可能偏离了基本的auth规范,它可能会要求它。所以YMMV。这可以通过使用preemptive auth并将标头值指定为suggested here来解决。

答案 2 :(得分:1)

你试过了吗?

IF(d.max_budget>(d.cur_budget + in_salary),'F','T')

  • 如果设置了用户/密码,则shiro如果错误则发送401
  • 如果未设置用户/密码,则不包含401. /api/** = authcBasic[permissive]为假