我的应用通常使用以下路由:
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将在重定向时保留查询参数(只是不是锚点)?或者有更好的方法来处理这个问题吗?
在重定向到CAS服务之前,您需要对目标URL进行URL编码.当呼叫从服务返回时,您将对其进行解码并在应用程序中重定向.
如果您使用的是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 {
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6457 次 |
| 最近记录: |