|
@@ -44,7 +44,7 @@ public class JwtFilter extends AccessControlFilter {
|
|
* onAccessDenied()是没有携带JwtToken的时候进行账号密码登录,登录成功允许访问,登录失败拒绝访问
|
|
* onAccessDenied()是没有携带JwtToken的时候进行账号密码登录,登录成功允许访问,登录失败拒绝访问
|
|
*/
|
|
*/
|
|
@Override
|
|
@Override
|
|
- protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) throws Exception {
|
|
|
|
|
|
+ protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) {
|
|
/*
|
|
/*
|
|
* 1. 返回true,shiro就直接允许访问url
|
|
* 1. 返回true,shiro就直接允许访问url
|
|
* 2. 返回false,shiro才会根据onAccessDenied的方法的返回值决定是否允许访问url
|
|
* 2. 返回false,shiro才会根据onAccessDenied的方法的返回值决定是否允许访问url
|
|
@@ -53,23 +53,11 @@ public class JwtFilter extends AccessControlFilter {
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * @param servletRequest
|
|
|
|
- * @param servletResponse
|
|
|
|
- * @return 返回结果为true表明登录通过
|
|
|
|
- * @throws Exception
|
|
|
|
- */
|
|
|
|
@Override
|
|
@Override
|
|
protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception {
|
|
protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception {
|
|
- /*
|
|
|
|
- * 跟前端约定将jwtToken放在请求的Header的Authorization中,Authorization:token
|
|
|
|
- */
|
|
|
|
|
|
+ // 跟前端约定将jwtToken放在请求的Header的Authorization中,Authorization:token
|
|
HttpServletRequest request = (HttpServletRequest) servletRequest;
|
|
HttpServletRequest request = (HttpServletRequest) servletRequest;
|
|
String requestURI = request.getRequestURI();
|
|
String requestURI = request.getRequestURI();
|
|
- if (this.logger.isInfoEnabled()) {
|
|
|
|
- this.logger.info("{} onAccessDenied方法被调用", requestURI);
|
|
|
|
- }
|
|
|
|
List<String> whitelist = this.properties.getWhitelist();
|
|
List<String> whitelist = this.properties.getWhitelist();
|
|
if (CollUtil.isNotEmpty(whitelist)) {
|
|
if (CollUtil.isNotEmpty(whitelist)) {
|
|
for (String path : whitelist) {
|
|
for (String path : whitelist) {
|
|
@@ -83,27 +71,28 @@ public class JwtFilter extends AccessControlFilter {
|
|
}
|
|
}
|
|
String token = request.getHeader(JwtContext.HEADER);
|
|
String token = request.getHeader(JwtContext.HEADER);
|
|
if (StrUtil.isBlank(token)) {
|
|
if (StrUtil.isBlank(token)) {
|
|
- this.onLoginFail(servletResponse, "请先登录后操作");
|
|
|
|
|
|
+ this.onLoginFail(servletResponse, requestURI, "请先登录后操作");
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
Claims claims;
|
|
Claims claims;
|
|
try {
|
|
try {
|
|
claims = this.jwtContext.getClaimsByToken(token);
|
|
claims = this.jwtContext.getClaimsByToken(token);
|
|
} catch (ExpiredJwtException e) {
|
|
} catch (ExpiredJwtException e) {
|
|
- this.onLoginFail(servletResponse, "登录已过期,请重新登录");
|
|
|
|
|
|
+ this.onLoginFail(servletResponse, requestURI, "登录已过期,请重新登录");
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
String username = claims.getSubject();
|
|
String username = claims.getSubject();
|
|
String validToken = this.jwtContext.getUserCache(username);
|
|
String validToken = this.jwtContext.getUserCache(username);
|
|
if (!token.equals(validToken)) {
|
|
if (!token.equals(validToken)) {
|
|
- this.onLoginFail(servletResponse, "token非法");
|
|
|
|
|
|
+ this.onLoginFail(servletResponse, requestURI, "token非法");
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
//登录失败要执行的方法
|
|
//登录失败要执行的方法
|
|
- private void onLoginFail(ServletResponse response, String msg) throws IOException {
|
|
|
|
|
|
+ private void onLoginFail(ServletResponse response, String url, String msg) throws IOException {
|
|
|
|
+ this.logger.warn("接口{} 认证或授权错误:{}", url, msg);
|
|
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
|
|
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
|
|
httpServletResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
|
|
httpServletResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
|
|
httpServletResponse.setCharacterEncoding("utf-8");
|
|
httpServletResponse.setCharacterEncoding("utf-8");
|