登录后重定向地址验证,如果是非法地址,则指定默认的登录成功地址

This commit is contained in:
thinkgem
2024-11-07 17:53:12 +08:00
parent 7826863bb5
commit ac314d9070
2 changed files with 37 additions and 11 deletions

View File

@@ -14,6 +14,7 @@ import com.jeesite.common.mapper.JsonMapper;
import com.jeesite.common.mapper.XmlMapper; import com.jeesite.common.mapper.XmlMapper;
import org.apache.commons.lang3.Validate; import org.apache.commons.lang3.Validate;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.util.AntPathMatcher;
import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes; import org.springframework.web.context.request.ServletRequestAttributes;
@@ -57,6 +58,11 @@ public class ServletUtils {
// 是否打印错误信息参数到视图页面(生产环境关闭) // 是否打印错误信息参数到视图页面(生产环境关闭)
private static final Boolean PRINT_ERROR_INFO = PROPS.getPropertyToBoolean("error.page.printErrorInfo", "true"); private static final Boolean PRINT_ERROR_INFO = PROPS.getPropertyToBoolean("error.page.printErrorInfo", "true");
// 允许重定向的地址不设置为全部允许设置this只允许本项目内部跳转多个用逗号隔开例如this,http://*.jeesite.com
private static final String[] ALLOW_REDIRECTS = PROPS.getPropertyToArray("shiro.allowRedirects", "");
private static final Boolean SCHEME_HTTPS = PROPS.getPropertyToBoolean("server.schemeHttps", "false");
private static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();
/** /**
* 获取当前请求对象 * 获取当前请求对象
* web.xml: <listener><listener-class> * web.xml: <listener><listener-class>
@@ -384,10 +390,15 @@ public class ServletUtils {
} }
/** /**
* 获取请求的域名(含端口) * 获取当前请求的域名(含端口)
* @author ThinkGem
*/ */
public static String getRequestDomain(String url) { public static String getThisDomain(HttpServletRequest request) {
String url = request.getRequestURL().toString();
String scheme = StringUtils.substringBefore(url, "://"); String scheme = StringUtils.substringBefore(url, "://");
if (SCHEME_HTTPS && StringUtils.equals(scheme, "http")) {
scheme = "https";
}
String domain = StringUtils.substringAfter(url, "://"); String domain = StringUtils.substringAfter(url, "://");
if (StringUtils.contains(domain, "/")) { if (StringUtils.contains(domain, "/")) {
domain = StringUtils.substringBefore(domain, "/"); domain = StringUtils.substringBefore(domain, "/");
@@ -395,6 +406,28 @@ public class ServletUtils {
return scheme + "://" + domain; return scheme + "://" + domain;
} }
/**
* 验证地址是否允许重定向
* @author ThinkGem
*/
public static boolean isAllowRedirects(HttpServletRequest request, String url) {
if (ALLOW_REDIRECTS == null || ALLOW_REDIRECTS.length == 0) {
return true;
}
boolean allow = false;
for (String pattern : ALLOW_REDIRECTS) {
String p = StringUtils.trim(pattern);
if ("this".equals(p)) {
p = getThisDomain(request);
}
if (PATH_MATCHER.match(p + "/**", url)){
allow = true;
break;
}
}
return allow;
}
/** /**
* 获得请求参数值 * 获得请求参数值
*/ */

View File

@@ -238,15 +238,8 @@ public class LoginController extends BaseController{
if (StringUtils.isBlank(successUrl)){ if (StringUtils.isBlank(successUrl)){
successUrl = (String)request.getAttribute("__url"); successUrl = (String)request.getAttribute("__url");
} }
if (StringUtils.contains(successUrl, "://")){ // 登录后重定向地址验证,如果是非法地址,则指定默认的登录成功地址
String ctxPath = Global.getCtxPath(); if (!ServletUtils.isAllowRedirects(request, successUrl) || StringUtils.isBlank(successUrl)){
String domain = ServletUtils.getRequestDomain(successUrl);
successUrl = StringUtils.substring(successUrl, domain.length());
if (StringUtils.startsWith(successUrl, ctxPath)) {
successUrl = StringUtils.substringAfter(successUrl, ctxPath);
}
}
if (StringUtils.isBlank(successUrl)){
successUrl = Global.getProperty("shiro.successUrl"); successUrl = Global.getProperty("shiro.successUrl");
} }