我的应用通常使用以下内容进行路由:
http://angularapp.com/#/page=bannanas
但是,如果用户未经过身份验证,则会将用户重定向到CAS登录页面,然后在登录后重定向回到:
注意重定向后,CAS完全剥离了锚/路由“#/”,因为不支持锚标记。 https://issues.jasig.org/browse/CAS-1338
最好的方法是什么?有没有办法可以做到这样的事情:
http://angularapp.com/?page=bannanas
触发相同的路由: http://angularapp.com/#/page=bannanas
由于CAS会在重定向时保留查询参数(而不是锚点)吗?或者有更好的方法来解决这个问题吗?
答案 0 :(得分:6)
在重定向到CAS服务之前,您需要对目标网址进行网址编码。当呼叫从服务返回时,您将对其进行解码并在应用程序中重定向。
如果您正在使用Java或.NET或类似的东西,您可以使用过滤器/ servlet在角度应用程序之外处理所有这些。
但这是基本想法。从您的示例中,您的角度应用程序位于http://angularapp.com/
。
用户请求页面http://angularapp.com/#/page=bannanas
,需要重定向到CAS服务器才能登录。您应该对该URL进行编码并将其作为请求参数传递,例如http://your-cas-site/login?returnUrl=http%3A%2F%2Fangularapp.com%2F%23%2Fpage%3Dbannanas
CAS处理身份验证并重定向回您的应用程序。
在您的应用中,写一个$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 {
}
}