未验证 提交 cdac92ca 编写于 作者: E EricZeng 提交者: GitHub

Merge pull request #229 from didi/dev

通过获取类的RequestMapping注解来判断当前请求是否需要登录
...@@ -11,8 +11,6 @@ public class ApiPrefix { ...@@ -11,8 +11,6 @@ public class ApiPrefix {
// login // login
public static final String API_V1_SSO_PREFIX = API_V1_PREFIX + "sso/"; public static final String API_V1_SSO_PREFIX = API_V1_PREFIX + "sso/";
public static final String API_V1_SSO_LOGIN = API_V1_SSO_PREFIX + "login";
public static final String API_V1_SSO_LOGOUT = API_V1_SSO_PREFIX + "logout";
// console // console
public static final String API_V1_NORMAL_PREFIX = API_V1_PREFIX + "normal/"; public static final String API_V1_NORMAL_PREFIX = API_V1_PREFIX + "normal/";
......
...@@ -16,5 +16,5 @@ public interface LoginService { ...@@ -16,5 +16,5 @@ public interface LoginService {
void logout(HttpServletRequest request, HttpServletResponse response, Boolean needJump2LoginPage); void logout(HttpServletRequest request, HttpServletResponse response, Boolean needJump2LoginPage);
boolean checkLogin(HttpServletRequest request, HttpServletResponse response); boolean checkLogin(HttpServletRequest request, HttpServletResponse response, String classRequestMappingValue);
} }
\ No newline at end of file
...@@ -63,19 +63,16 @@ public class LoginServiceImpl implements LoginService { ...@@ -63,19 +63,16 @@ public class LoginServiceImpl implements LoginService {
} }
@Override @Override
public boolean checkLogin(HttpServletRequest request, HttpServletResponse response) { public boolean checkLogin(HttpServletRequest request, HttpServletResponse response, String classRequestMappingValue) {
String uri = request.getRequestURI(); if (ValidateUtils.isNull(classRequestMappingValue)) {
if (uri.contains("..") || uri.contains("./") || uri.contains("///")) { LOGGER.error("class=LoginServiceImpl||method=checkLogin||msg=uri illegal||uri={}", request.getRequestURI());
LOGGER.error("class=LoginServiceImpl||method=checkLogin||msg=uri illegal, contains .. or ./ or ///||uri={}", uri);
singleSignOn.setRedirectToLoginPage(response); singleSignOn.setRedirectToLoginPage(response);
return false; return false;
} }
uri = uri.replaceAll("//", "/");
if (uri.equals(ApiPrefix.API_V1_SSO_LOGIN) if (classRequestMappingValue.equals(ApiPrefix.API_V1_SSO_PREFIX)
|| uri.equals(ApiPrefix.API_V1_SSO_LOGOUT) || classRequestMappingValue.equals(ApiPrefix.API_V1_THIRD_PART_PREFIX)
|| uri.startsWith(ApiPrefix.API_V1_THIRD_PART_PREFIX) || classRequestMappingValue.equals(ApiPrefix.GATEWAY_API_V1_PREFIX)) {
|| uri.startsWith(ApiPrefix.GATEWAY_API_V1_PREFIX)) {
// 白名单接口直接true // 白名单接口直接true
return true; return true;
} }
......
package com.xiaojukeji.kafka.manager.web.inteceptor; package com.xiaojukeji.kafka.manager.web.inteceptor;
import com.xiaojukeji.kafka.manager.account.LoginService; import com.xiaojukeji.kafka.manager.account.LoginService;
import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
...@@ -15,6 +20,8 @@ import javax.servlet.http.HttpServletResponse; ...@@ -15,6 +20,8 @@ import javax.servlet.http.HttpServletResponse;
*/ */
@Component @Component
public class PermissionInterceptor implements HandlerInterceptor { public class PermissionInterceptor implements HandlerInterceptor {
private static final Logger LOGGER = LoggerFactory.getLogger(PermissionInterceptor.class);
@Autowired @Autowired
private LoginService loginService; private LoginService loginService;
...@@ -28,6 +35,31 @@ public class PermissionInterceptor implements HandlerInterceptor { ...@@ -28,6 +35,31 @@ public class PermissionInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, HttpServletResponse response,
Object handler) throws Exception { Object handler) throws Exception {
return loginService.checkLogin(request, response);
String classRequestMappingValue = null;
try {
classRequestMappingValue = getClassRequestMappingValue(handler);
} catch (Exception e) {
LOGGER.error("class=PermissionInterceptor||method=preHandle||uri={}||msg=parse class request-mapping failed", request.getRequestURI(), e);
}
return loginService.checkLogin(request, response, classRequestMappingValue);
}
private String getClassRequestMappingValue(Object handler) {
RequestMapping classRM = null;
if(handler instanceof HandlerMethod) {
HandlerMethod hm = (HandlerMethod)handler;
classRM = hm.getMethod().getDeclaringClass().getAnnotation(RequestMapping.class);
} else if(handler instanceof org.springframework.web.servlet.mvc.Controller) {
org.springframework.web.servlet.mvc.Controller hm = (org.springframework.web.servlet.mvc.Controller)handler;
Class<? extends org.springframework.web.servlet.mvc.Controller> hmClass = hm.getClass();
classRM = hmClass.getAnnotation(RequestMapping.class);
} else {
classRM = handler.getClass().getAnnotation(RequestMapping.class);
}
if (ValidateUtils.isNull(classRM) || classRM.value().length < 0) {
return null;
}
return classRM.value()[0];
} }
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册