我在/ api下有一组API。如果我的shiro.ini将其列为:
/api/** = authcBasic
然后需要基本身份验证。如果存在anon代替authcBasic,则不需要auth。我希望能够将API与基本身份验证一起使用,因此我可以以编程方式检查用户是否已对POST进行身份验证,但仍允许匿名访问同一URI上的GET。或者,为匿名用户隐藏相同URI的受限数据,并将其显示给身份验证的用户。
这可能吗?
答案 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')
/api/** = authcBasic[permissive]
为假