新增CSRF防护功能
parent
407f9f46d8
commit
ea9976575a
@ -0,0 +1,76 @@
|
|||||||
|
package com.ruoyi.framework.shiro.web.filter.csrf;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import javax.servlet.ServletRequest;
|
||||||
|
import javax.servlet.ServletResponse;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import org.apache.shiro.web.filter.AccessControlFilter;
|
||||||
|
import com.ruoyi.common.constant.ShiroConstants;
|
||||||
|
import com.ruoyi.common.core.text.Convert;
|
||||||
|
import com.ruoyi.common.utils.ServletUtils;
|
||||||
|
import com.ruoyi.common.utils.ShiroUtils;
|
||||||
|
import com.ruoyi.common.utils.StringUtils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* csrf过滤器
|
||||||
|
*
|
||||||
|
* @author ruoyi
|
||||||
|
*/
|
||||||
|
public class CsrfValidateFilter extends AccessControlFilter
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* 白名单链接
|
||||||
|
*/
|
||||||
|
private List<String> csrfWhites;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue)
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
|
||||||
|
if (!isAllowMethod(httpServletRequest))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (StringUtils.matches(httpServletRequest.getServletPath(), csrfWhites))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return validateResponse(httpServletRequest, httpServletRequest.getHeader(ShiroConstants.CSRF_TOKEN));
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean validateResponse(HttpServletRequest request, String requestToken)
|
||||||
|
{
|
||||||
|
Object obj = ShiroUtils.getSession().getAttribute(ShiroConstants.CSRF_TOKEN);
|
||||||
|
String sessionToken = Convert.toStr(obj, "");
|
||||||
|
if (StringUtils.isEmpty(requestToken) || !requestToken.equalsIgnoreCase(sessionToken))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception
|
||||||
|
{
|
||||||
|
ServletUtils.renderString((HttpServletResponse) response, "{\"code\":\"1\",\"msg\":\"当前请求的安全验证未通过,请刷新页面后重试。\"}");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isAllowMethod(HttpServletRequest request)
|
||||||
|
{
|
||||||
|
String method = request.getMethod();
|
||||||
|
return "POST".equalsIgnoreCase(method);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> getCsrfWhites()
|
||||||
|
{
|
||||||
|
return csrfWhites;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCsrfWhites(List<String> csrfWhites)
|
||||||
|
{
|
||||||
|
this.csrfWhites = csrfWhites;
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue