如何使用带有CAS身份验证重定向的angularjs路由,或者只是角度不可用?

时间:2015-02-04 14:23:36

标签: angularjs cas

我的应用通常使用以下内容进行路由:

http://angularapp.com/#/page=bannanas

但是,如果用户未经过身份验证,则会将用户重定向到CAS登录页面,然后在登录后重定向回到:

http://angularapp.com/

注意重定向后,CAS完全剥离了锚/路由“#/”,因为不支持锚标记。 https://issues.jasig.org/browse/CAS-1338

最好的方法是什么?有没有办法可以做到这样的事情:

http://angularapp.com/?page=bannanas

触发相同的路由: http://angularapp.com/#/page=bannanas

由于CAS会在重定向时保留查询参数(而不是锚点)吗?或者有更好的方法来解决这个问题吗?

1 个答案:

答案 0 :(得分:6)

在重定向到CAS服务之前,您需要对目标网址进行网址编码。当呼叫从服务返回时,您将对其进行解码并在应用程序中重定向。

如果您正在使用Java或.NET或类似的东西,您可以使用过滤器/ servlet在角度应用程序之外处理所有这些。

但这是基本想法。从您的示例中,您的角度应用程序位于http://angularapp.com/

  1. 用户请求页面http://angularapp.com/#/page=bannanas,需要重定向到CAS服务器才能登录。您应该对该URL进行编码并将其作为请求参数传递,例如http://your-cas-site/login?returnUrl=http%3A%2F%2Fangularapp.com%2F%23%2Fpage%3Dbannanas

  2. CAS处理身份验证并重定向回您的应用程序。

  3. 在您的应用中,写一个$http interceptor来监视请求参数returnUrl。找到后,解码returnUrl=http%3A%2F%2Fangularapp.com%2F%23%2Fpage%3Dbannanas并重定向到它:http://angularapp.com/#/page=bannanas

  4. 如果您的应用程序服务器支持,也可以通过过滤器在外部处理。 (我已经在Java中为我的应用程序完成了这个,但.NET和大多数其他服务器都支持同样的事情。)

    -

    根据请求添加此示例代码。这是我的auth过滤器,它处理重定向到登录页面。

    import java.io.IOException;
    import java.net.URLEncoder;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class LoginRedirect implements Filter {
    
      @Override
      public void destroy() {
    
      }
    
      @Override
      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
          throws IOException, ServletException {
    
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        HttpServletResponse httpServletResponse = (HttpServletResponse) response;
    
        // See if user has an active session.
        User currentUser = UserService.getCurrentUser(httpServletRequest.getSession());
        if (currentUser == null) {
          // No active session, need to error or redirect.
          if (httpServletRequest.getRequestURI().indexOf(httpServletRequest.getContextPath() + "/api/") == 0) {
            // For API requests, return an UNATHORIZED http response.
            httpServletResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED);
          } else {
            // For all other requests, forward the user to the login page.
            StringBuilder returnTo = new StringBuilder();
            returnTo.append(httpServletRequest.getRequestURI());
            if (httpServletRequest.getQueryString() != null) {
              returnTo.append("?");
              returnTo.append(httpServletRequest.getQueryString());
            }
            httpServletResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            httpServletResponse.sendRedirect(httpServletRequest.getContextPath() + "/login?returnTo=" +
                URLEncoder.encode(returnTo.toString(), "UTF-8"));
          }
        } else if (currentUser.isDeleted() || currentUser.isLocked()
            || (!currentUser.isRoleAdmin() && !currentUser.isRoleStaff())) {
          httpServletResponse.sendError(HttpServletResponse.SC_FORBIDDEN);
        } else {
          chain.doFilter(httpServletRequest, httpServletResponse);
        }
      }
    
      @Override
      public void init(FilterConfig filterConfig) throws ServletException {
    
      }
    
    }