Browse Source

Merge branch 'feature_adapt_oauth' into xjw

# Conflicts:
#	src/main/resources/application.properties
xujiawei 5 years ago
parent
commit
96049cb884

+ 5 - 0
pom.xml

@@ -78,6 +78,11 @@
             <artifactId>hanlp</artifactId>
             <version>portable-1.7.0</version>
         </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.18.8</version>
+        </dependency>
 
         <dependency>
             <groupId>org.springframework.cloud</groupId>

+ 30 - 0
src/main/java/edu/nju/configuration/RestTemplateConfiguration.java

@@ -0,0 +1,30 @@
+package edu.nju.configuration;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.client.ClientHttpRequestFactory;
+import org.springframework.http.client.SimpleClientHttpRequestFactory;
+import org.springframework.web.client.RestTemplate;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2019-09-28 11:10
+ */
+@Configuration
+public class RestTemplateConfiguration {
+    @Bean
+    public RestTemplate restTemplate(ClientHttpRequestFactory factory){
+        RestTemplate restTemplate = new RestTemplate(factory);
+        restTemplate.setErrorHandler(new RestTemplateErrorHandler());
+        return restTemplate;
+    }
+
+    @Bean
+    public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
+        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
+        factory.setConnectTimeout(15000);
+        factory.setReadTimeout(5000);
+        return factory;
+    }
+}

+ 23 - 0
src/main/java/edu/nju/configuration/RestTemplateErrorHandler.java

@@ -0,0 +1,23 @@
+package edu.nju.configuration;
+
+import org.springframework.http.client.ClientHttpResponse;
+import org.springframework.web.client.ResponseErrorHandler;
+
+import java.io.IOException;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2019-09-29 01:32
+ */
+public class RestTemplateErrorHandler implements ResponseErrorHandler {
+    @Override
+    public boolean hasError(ClientHttpResponse clientHttpResponse) throws IOException {
+        return false;
+    }
+
+    @Override
+    public void handleError(ClientHttpResponse clientHttpResponse) throws IOException {
+
+    }
+}

+ 24 - 0
src/main/java/edu/nju/configuration/WebMvcConfiguration.java

@@ -0,0 +1,24 @@
+package edu.nju.configuration;
+
+import edu.nju.controller.interceptor.AuthCheckInterceptor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2019-09-29 14:19
+ */
+@Configuration
+public class WebMvcConfiguration implements WebMvcConfigurer {
+    @Autowired
+    private AuthCheckInterceptor authCheckInterceptor;
+
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        registry.addInterceptor(authCheckInterceptor)
+                .addPathPatterns("/**");
+    }
+}

+ 70 - 0
src/main/java/edu/nju/controller/OAuthController.java

@@ -0,0 +1,70 @@
+package edu.nju.controller;
+
+import edu.nju.controller.data.UserInfo;
+import edu.nju.controller.interceptor.AuthRequired;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.client.HttpClientErrorException;
+import org.springframework.web.client.RestTemplate;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import java.io.IOException;
+import java.util.Map;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2019-09-28 10:38
+ */
+@Slf4j
+@RestController
+public class OAuthController {
+
+    @Autowired
+    private RestTemplate restTemplate;
+
+    @RequestMapping(value = "/auth", method = RequestMethod.GET)
+    public void auth(@RequestParam("task_id") Long taskId,
+                     @RequestParam("case_id") Long caseId,
+                     @RequestParam("code") String code, HttpSession session, HttpServletResponse response){
+        String authUrl = "http://api.mooctest.net/api/v1/oauth/ticket?code="+code;
+        String userUrl = "http://api.mooctest.net/api/v1/user?session_ticket=";
+        ResponseEntity<Map> ticketResponse = restTemplate.getForEntity(authUrl, Map.class);
+        if (ticketResponse.getStatusCode().is4xxClientError()){
+            log.info(ticketResponse.getBody().get("message").toString());
+            throw new HttpClientErrorException(HttpStatus.UNAUTHORIZED);
+        }
+        String  session_ticket = (String)ticketResponse.getBody().get("session_ticket");
+        ResponseEntity<UserInfo> userInfoResponse = restTemplate.getForEntity(userUrl + session_ticket, UserInfo.class);
+        if (userInfoResponse.getStatusCode().is4xxClientError()){
+            log.info(ticketResponse.getBody().get("message").toString());
+            throw new HttpClientErrorException(HttpStatus.UNAUTHORIZED);
+        }
+        session.setAttribute("userInfo", userInfoResponse.getBody());
+        session.setAttribute("caseId", caseId);
+        session.setAttribute("taskId", taskId);
+        try {
+            response.sendRedirect("http://47.99.140.117:9001/report/detail/"+taskId+"/"+caseId+"/"+userInfoResponse.getBody().getId());
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    @AuthRequired
+    @RequestMapping(value = "/auth/user", method = RequestMethod.GET)
+    public UserInfo getLoginUser(HttpSession session){
+        if (session.getAttribute("userInfo")==null)
+            throw new HttpClientErrorException(HttpStatus.UNAUTHORIZED);
+        UserInfo userInfo = (UserInfo) session.getAttribute("userInfo");
+        return userInfo;
+    }
+
+}

+ 2 - 0
src/main/java/edu/nju/controller/ReportController.java

@@ -6,6 +6,7 @@ import java.util.List;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
 
+import edu.nju.controller.interceptor.AuthRequired;
 import org.json.JSONArray;
 import org.json.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -34,6 +35,7 @@ public class ReportController {
 	DotService dservice;
 	
 	//获取用户的有效信息
+	@AuthRequired
 	@RequestMapping(value = "/report")
 	@ResponseBody
 	public void getReport(String report_id, String case_take_id, HttpServletResponse response) {

+ 27 - 0
src/main/java/edu/nju/controller/data/UserInfo.java

@@ -0,0 +1,27 @@
+package edu.nju.controller.data;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2019-09-29 12:19
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class UserInfo {
+    private Long id;
+
+    private String email;
+
+    private String name;
+
+    private String mobile;
+
+    private String school;
+
+    private String open_id;
+}

+ 44 - 0
src/main/java/edu/nju/controller/interceptor/AuthCheckInterceptor.java

@@ -0,0 +1,44 @@
+package edu.nju.controller.interceptor;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.HttpClientErrorException;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2019-09-29 14:15
+ */
+@Slf4j
+@Component
+public class AuthCheckInterceptor extends HandlerInterceptorAdapter {
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+        if (hasAuthRequired(handler)){
+            log.info("需要认证的接口访问行为");
+            if (request.getSession().getAttribute("userInfo") == null)
+                throw new HttpClientErrorException(HttpStatus.UNAUTHORIZED);
+            else
+                log.info("用户已登录, userInfo:"+request.getSession().getAttribute("userInfo"));
+        }
+        return true;
+    }
+
+    private boolean hasAuthRequired(Object handler) {
+        if(handler instanceof HandlerMethod) {
+            HandlerMethod handlerMethod = (HandlerMethod) handler;
+            AuthRequired authRequired = handlerMethod.getMethod().getAnnotation(AuthRequired.class);
+            if(authRequired==null){
+                authRequired = handlerMethod.getBeanType().getAnnotation(AuthRequired.class);
+            }
+            return !(authRequired == null);
+        }
+        return false;
+    }
+}

+ 16 - 0
src/main/java/edu/nju/controller/interceptor/AuthRequired.java

@@ -0,0 +1,16 @@
+package edu.nju.controller.interceptor;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2019-09-29 14:17
+ */
+@Target({ElementType.METHOD, ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface AuthRequired {
+}