7

我有一个受 Shibboleth 保护的 Jersey API,一个 SSO 实现。Shibboleth 将登录用户的 id 放在请求属性中。在后端,我使用 Shiro 进行授权。Shiro 想知道登录用户,以便加载权限。

从请求属性中获取 userId 并进入 Shiro 的正确方法是什么?现在,我正在尝试的是:

@Provider
public final class ShiroLoginFilter implements ContainerRequestFilter {

    @Context
    private HttpServletRequest request;

    @Override
    public void filter(final ContainerRequestContext requestContext)
        throws IOException {

        final String userId = (String) this.request.getAttribute("nameid");
        final Subject subject = SecurityUtils.getSubject();
        subject.login(new LocusAuthenticationToken(userId));

    }
}

不幸的是,由于JERSEY-1960,我无法将请求上下文注入过滤器。每个用户都需要“登录”才能加载权限。我宁愿不必在 API 的每个方法中重复登录代码。我也不允许使用 web.xml 过滤器(我的老板)。我在这里有什么好的选择吗?

4

1 回答 1

12

您还应该能够ServletRequest直接ContainerRequestContext通过ContainerRequestContext#getProperty获取属性,如方法的 JavaDoc 中所述:

在 Servlet 容器中,属性与 . 同步ServletRequest并公开ServletRequest. 对属性的任何修改也会反映在关联的属性集中ServletRequest

注意:HttpServletRequest自 Jersey 2.4(10.2013 发布)以来,注入应该按预期工作。

于 2013-10-30T20:35:36.667 回答