【问题标题】:How can I integrate SSO authentication with JSF?如何将 SSO 身份验证与 JSF 集成?
【发布时间】:2015-06-23 12:48:44
【问题描述】:

我目前正在使用过滤器来检查 SSO 身份验证。 (如果请求标头包含变量“Proxy-Remote-User”,则认为 SSO 已通过身份验证)。

if (!(isSsoLoggedIn(request)) {
    response.sendRedirect(ERROR_PAGE);
    return;
} else {
    chain.doFilter(req, res);
}

private boolean isSsoLoggedIn(HttpServletRequest request) {
    return request != null && request.getHeader("Proxy-Remote-User") != null
            && !request.getHeader("Proxy-Remote-User").equals("");
}

现在,一旦用户通过身份验证,我想将该变量(它是一个电子邮件地址)传递给 JSF。我使用会话范围的 bean 来做到这一点:

@PostConstruct
public void init {
    Map<String, String> requestHeaderMap = FacesContext.getCurrentInstance().getExternalContext().getRequestHeaderMap();
    String email = requestHeaderMap.get("Proxy-Remote-User");
    user = getPersonFromDB(email);
}

这看起来很简单,但我不确定它是否是“正确”的方法。依靠 bean 的实例化来验证身份验证似乎是不正确的。

我刚刚想到的一个想法: 使用 CDI 会话范围的 bean 并将其 @Inject 到过滤器中。然后,您可以让过滤器本身检查有效用户,如果有效,则将其设置在会话范围的 bean 中,否则将其转发到错误页面。

这听起来像是一个有效的解决方案吗?

另一种方法可能是在呈现视图之前使用此处提到的视图参数让每个页面检查身份验证:

JSF calls methods when managed bean constructor sends 404 ERROR CODE

<f:metadata>
    <f:viewAction action="#{bean.checkForValidUser}" />
</f:metadata>

对此我唯一的问题是......这需要将相同的代码复制/粘贴到每个看起来多余的页面(或至少一个模板供所有人使用)。

【问题讨论】:

  • 你手头有 CDI 吗?
  • 不幸的是,我正在使用 ManagedBeans,但我们的目标是将来转换为 CDI。我还没有研究过这个过程,但如果它很简单,我可能会转换为他们来让它工作。
  • 如果我可以转换为 CDI,您是否建议我上面的 CDI 解决方案有效?

标签: jsf authentication jsf-2 filter single-sign-on


【解决方案1】:

这是我想出的答案(感谢@BalusC 的一些提示)。

我检查是否启用了开发人员登录或 SSO 是否已通过身份验证。获得电子邮件地址后,我会查看其是否为有效用户,验证 JSF 会话是否包含正确的用户,如果是,则将其转发给他们。

/**
 * This filter handles SSO login (or developer login) privileges to the web
 * application.
 */
@WebFilter(servletNames = "Faces Servlet")
public class SecurityFilter implements Filter {

    @Inject
    private SessionManager sessionManager;

    @EJB
    private PersonWriteFacadeRemote personFacade;

    private HttpServletRequest currentRequest;
    private HttpServletResponse currentResponse;

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

        currentRequest = (HttpServletRequest) req;
        currentResponse = (HttpServletResponse) res;
        HttpSession session = currentRequest.getSession();
        String requestedPage = currentRequest.getRequestURI();

            // check if the session is initialized
        // if not, initialize it
        if (!isSessionInitialized()) {
            Person user = getCurrentUser();

            // if we can't figure out who the user is, then send 401 error
            if (user != null) {
                initializeSession(user);
            } else {
                currentResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED);
                return;
            }

                // if it is initialized, check if it actually matches the current
            // user
            // if not, invalidate the session and redirect them back to the page
            // to reinitialize it
        } else if (!isSessionCurrentUsers()) {
            session.invalidate();
            currentResponse.sendRedirect(requestedPage);
            return;
        }

        chain.doFilter(req, res); // If all looks good, continue the request

    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void destroy() {
    }

    private Person getCurrentUser() {
        try {
            return personFacade.createFromEmail(getUserEmail());
        } catch (InvalidAttributesException ex) {
            Logger.getLogger(SecurityFilter.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    private String getUserEmail() {
        return isDevLoginEnabled() ? getUserEmailFromJndi() : getUserEmailFromSso();
    }

    private String getUserEmailFromJndi() {
        return JNDI.lookup("devLoginEmail");
    }

    private String getUserEmailFromSso() {
        return currentRequest != null && currentRequest.getHeader("Proxy-Remote-User") != null
                && !currentRequest.getHeader("Proxy-Remote-User").equals("")
                        ? currentRequest.getHeader("Proxy-Remote-User") : null;
    }

    private boolean isDevLoginEnabled() {
        Boolean devLoginEnabled = JNDI.lookup("devLoginEnabled");
        return (devLoginEnabled != null ? devLoginEnabled : false);
    }

    private boolean isSessionInitialized() {
        return sessionManager.getUser() != null;
    }

    private void initializeSession(Person user) {
        sessionManager.initializeSession(user);
    }

    private boolean isSessionCurrentUsers() {
        return sessionManager.getUser() != null && sessionManager.getUser().getEmail() != null
                && sessionManager.getUser().getEmail().equals(getUserEmail());
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多