prevent NullPointerException on AuthInterceptor/ make session timeout configurable (#691)
Co-authored-by: PENG TANG <pengtang@PENGs-MacBook-Pro.local>
diff --git a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/interceptor/AuthInterceptor.java b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/interceptor/AuthInterceptor.java
index 98ddb47..a9cf6cc 100644
--- a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/interceptor/AuthInterceptor.java
+++ b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/interceptor/AuthInterceptor.java
@@ -22,17 +22,25 @@
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.NotNull;
import java.lang.reflect.Method;
@Component
public class AuthInterceptor extends HandlerInterceptorAdapter {
@Value("${admin.check.authority:true}")
private boolean checkAuthority;
+
+ //make session timeout configurable
+ //default to be an hour:1000 * 60 * 60
+ @Value("${admin.check.sessionTimeoutMilli:3600000}")
+ private long sessionTimeoutMilli;
+
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (!(handler instanceof HandlerMethod) || !checkAuthority) {
@@ -44,17 +52,33 @@
if (null == authority) {
authority = method.getDeclaringClass().getDeclaredAnnotation(Authority.class);
}
+
+ String authorization = request.getHeader("Authorization");
if (null != authority && authority.needLogin()) {
- String authorization = request.getHeader("Authorization");
+ //check if 'authorization' is empty to prevent NullPointException
+ //since UserController.tokenMap is an instance of ConcurrentHashMap.
+ if (StringUtils.isEmpty(authorization)) {
+ //While authentication is required and 'Authorization' string is missing in the request headers,
+ //reject this request(http403).
+ rejectedResponse(response);
+ return false;
+ }
+
UserController.User user = UserController.tokenMap.get(authorization);
- if (null != user && System.currentTimeMillis() - user.getLastUpdateTime() <= 1000 * 60 * 60) {
+ if (null != user && System.currentTimeMillis() - user.getLastUpdateTime() <= sessionTimeoutMilli) {
user.setLastUpdateTime(System.currentTimeMillis());
return true;
}
- response.setStatus(HttpStatus.UNAUTHORIZED.value());
+
+ //while user not found, or session timeout, reject this request(http403).
+ rejectedResponse(response);
return false;
} else {
return true;
}
}
+
+ private static void rejectedResponse(@NotNull HttpServletResponse response) {
+ response.setStatus(HttpStatus.UNAUTHORIZED.value());
+ }
}