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

Rol*_*ndo 6 cas angularjs

我的应用通常使用以下路由:

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将在重定向时保留查询参数(只是不是锚点)?或者有更好的方法来处理这个问题吗?

Nic*_*ras 6

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

如果您使用的是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

如果您的应用程序服务器支持,也可以通过过滤器在外部处理.(我已经在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 {

  }

}
Run Code Online (Sandbox Code Playgroud)