From 5fab97cf7e49636d446e063ee6e0eea80c124bd2 Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期三, 15 三月 2023 19:05:56 +0800 Subject: [PATCH] 支持不同域的前后端分离部署 --- src/main/java/com/genersoft/iot/vmp/conf/security/AnonymousAuthenticationEntryPoint.java | 9 - src/main/java/com/genersoft/iot/vmp/conf/security/JwtUtils.java | 2 src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceConfig.java | 1 web_src/src/App.vue | 23 -- src/main/java/com/genersoft/iot/vmp/vmanager/bean/WVPResult.java | 4 web_src/src/components/dialog/changePassword.vue | 3 src/main/java/com/genersoft/iot/vmp/conf/ApiAccessFilter.java | 10 - src/main/java/com/genersoft/iot/vmp/conf/GlobalExceptionHandler.java | 11 + web_src/src/components/service/UserService.js | 42 ++++++ src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java | 5 web_src/package.json | 2 src/main/resources/all-application.yml | 4 web_src/package-lock.json | 14 +- src/main/java/com/genersoft/iot/vmp/vmanager/server/ServerController.java | 4 web_src/src/components/Login.vue | 14 - web_src/src/main.js | 34 +++- src/main/java/com/genersoft/iot/vmp/conf/security/JwtAuthenticationFilter.java | 15 + src/main/java/com/genersoft/iot/vmp/conf/security/WebSecurityConfig.java | 99 +++++-------- src/main/java/com/genersoft/iot/vmp/conf/security/SecurityUtils.java | 13 - src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java | 10 + web_src/src/layout/UiHeader.vue | 32 +++- src/main/java/com/genersoft/iot/vmp/vmanager/user/UserController.java | 22 ++ web_src/src/components/dialog/importChannel.vue | 8 + 23 files changed, 226 insertions(+), 155 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/conf/ApiAccessFilter.java b/src/main/java/com/genersoft/iot/vmp/conf/ApiAccessFilter.java index e30b6db..4d885e8 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/ApiAccessFilter.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/ApiAccessFilter.java @@ -14,7 +14,8 @@ import org.springframework.util.ObjectUtils; import org.springframework.web.filter.OncePerRequestFilter; -import javax.servlet.*; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -48,13 +49,6 @@ long start = System.currentTimeMillis(); // 璇锋眰杩涘叆鏃堕棿 String uriName = ApiSaveConstant.getVal(servletRequest.getRequestURI()); - String origin = servletRequest.getHeader("Origin"); - servletResponse.setContentType("application/json;charset=UTF-8"); - servletResponse.setHeader("Access-Control-Allow-Origin", origin != null ? origin : "*"); - servletResponse.setHeader("Access-Control-Allow-Credentials", "true"); - servletResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, PATCH, DELETE, PUT"); - servletResponse.setHeader("Access-Control-Max-Age", "3600"); - servletResponse.setHeader("Access-Control-Allow-Headers", "token,Content-Type,Content-Length, Authorization, Accept,X-Requested-With,domain,zdy"); filterChain.doFilter(servletRequest, servletResponse); if (uriName != null && userSetting != null && userSetting.getLogInDatebase() != null && userSetting.getLogInDatebase()) { diff --git a/src/main/java/com/genersoft/iot/vmp/conf/GlobalExceptionHandler.java b/src/main/java/com/genersoft/iot/vmp/conf/GlobalExceptionHandler.java index 728afb9..dbea741 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/GlobalExceptionHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/GlobalExceptionHandler.java @@ -32,6 +32,17 @@ return WVPResult.fail(ErrorCode.ERROR500.getCode(), e.getMessage()); } + /** + * 榛樿寮傚父澶勭悊 + * @param e 寮傚父 + * @return 缁熶竴杩斿洖缁撴灉 + */ + @ExceptionHandler(IllegalStateException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public WVPResult<String> exceptionHandler(IllegalStateException e) { + return WVPResult.fail(ErrorCode.ERROR400); + } + /** * 鑷畾涔夊紓甯稿鐞嗭紝 澶勭悊controller涓繑鍥炵殑閿欒 diff --git a/src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java b/src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java index 1e7fd36..e944476 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java @@ -55,6 +55,8 @@ private List<String> interfaceAuthenticationExcludes = new ArrayList<>(); + private List<String> allowedOrigins = new ArrayList<>(); + public Boolean getSavePositionHistory() { return savePositionHistory; } @@ -218,4 +220,12 @@ public void setSipLog(Boolean sipLog) { this.sipLog = sipLog; } + + public List<String> getAllowedOrigins() { + return allowedOrigins; + } + + public void setAllowedOrigins(List<String> allowedOrigins) { + this.allowedOrigins = allowedOrigins; + } } diff --git a/src/main/java/com/genersoft/iot/vmp/conf/security/AnonymousAuthenticationEntryPoint.java b/src/main/java/com/genersoft/iot/vmp/conf/security/AnonymousAuthenticationEntryPoint.java index 7a178d9..3f70b79 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/security/AnonymousAuthenticationEntryPoint.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/security/AnonymousAuthenticationEntryPoint.java @@ -28,15 +28,6 @@ String username = jwtUser.getUserName(); UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, jwtUser.getPassword() ); SecurityContextHolder.getContext().setAuthentication(token); - System.out.println(jwt); - // 鍏佽璺ㄥ煙 - String origin = request.getHeader("Origin"); - response.setHeader("Access-Control-Allow-Credentials", "true"); - response.setHeader("Access-Control-Allow-Origin", origin != null ? origin : "*"); - response.setHeader("Access-Control-Allow-Methods", "PUT,POST, GET,DELETE,OPTIONS"); - // 鍏佽鑷畾涔夎姹傚ごtoken(鍏佽head璺ㄥ煙) - response.setHeader("Access-Control-Allow-Headers", "token, Accept, Origin, X-Requested-With, Content-Type, Last-Modified"); - response.setHeader("Content-type", "application/json;charset=UTF-8"); JSONObject jsonObject = new JSONObject(); jsonObject.put("code", ErrorCode.ERROR401.getCode()); jsonObject.put("msg", ErrorCode.ERROR401.getMsg()); diff --git a/src/main/java/com/genersoft/iot/vmp/conf/security/JwtAuthenticationFilter.java b/src/main/java/com/genersoft/iot/vmp/conf/security/JwtAuthenticationFilter.java index 91709aa..8fdcee1 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/security/JwtAuthenticationFilter.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/security/JwtAuthenticationFilter.java @@ -24,14 +24,23 @@ @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { + + // 蹇界暐鐧诲綍璇锋眰鐨則oken楠岃瘉 + String requestURI = request.getRequestURI(); + if (requestURI.equalsIgnoreCase("/api/user/login")) { + chain.doFilter(request, response); + return; + } String jwt = request.getHeader(JwtUtils.getHeader()); // 杩欓噷濡傛灉娌℃湁jwt锛岀户缁線鍚庤蛋锛屽洜涓哄悗闈㈣繕鏈夐壌鏉冪鐞嗗櫒绛夊幓鍒ゆ柇鏄惁鎷ユ湁韬唤鍑瘉锛屾墍浠ユ槸鍙互鏀捐鐨� // 娌℃湁jwt鐩稿綋浜庡尶鍚嶈闂紝鑻ユ湁涓�浜涙帴鍙f槸闇�瑕佹潈闄愮殑锛屽垯涓嶈兘璁块棶杩欎簺鎺ュ彛 if (StringUtils.isBlank(jwt)) { - chain.doFilter(request, response); - return; + jwt = request.getParameter(JwtUtils.getHeader()); + if (StringUtils.isBlank(jwt)) { + chain.doFilter(request, response); + return; + } } - JwtUser jwtUser = JwtUtils.verifyToken(jwt); String username = jwtUser.getUserName(); diff --git a/src/main/java/com/genersoft/iot/vmp/conf/security/JwtUtils.java b/src/main/java/com/genersoft/iot/vmp/conf/security/JwtUtils.java index 378e5d6..57911b0 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/security/JwtUtils.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/security/JwtUtils.java @@ -23,7 +23,7 @@ private static final Logger logger = LoggerFactory.getLogger(JwtUtils.class); - private static final String HEADER = "Access-Token"; + private static final String HEADER = "access-token"; private static final String AUDIENCE = "Audience"; private static final long EXPIRED_THRESHOLD = 10 * 60; diff --git a/src/main/java/com/genersoft/iot/vmp/conf/security/SecurityUtils.java b/src/main/java/com/genersoft/iot/vmp/conf/security/SecurityUtils.java index 76f1162..a8d3568 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/security/SecurityUtils.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/security/SecurityUtils.java @@ -27,16 +27,13 @@ public static LoginUser login(String username, String password, AuthenticationManager authenticationManager) throws AuthenticationException { //浣跨敤security妗嗘灦鑷甫鐨勯獙璇乼oken鐢熸垚鍣� 涔熷彲浠ヨ嚜瀹氫箟銆� UsernamePasswordAuthenticationToken token =new UsernamePasswordAuthenticationToken(username,password); -// Authentication authenticate = authenticationManager.authenticate(token); -// SecurityContextHolder.getContext().setAuthentication(authenticate); + //璁よ瘉 濡傛灉澶辫触锛岃繖閲屼細鑷姩寮傚父鍚庤繑鍥烇紝鎵�浠ヨ繖閲屼笉闇�瑕佸垽鏂繑鍥炲�兼槸鍚︿负绌猴紝纭畾鏄惁鐧诲綍鎴愬姛 + Authentication authenticate = authenticationManager.authenticate(token); + LoginUser user = (LoginUser) authenticate.getPrincipal(); + SecurityContextHolder.getContext().setAuthentication(token); - -// LoginUser user = (LoginUser) authenticate.getPrincipal(); - User user = new User(); - user.setUsername(username); - LoginUser loginUser = new LoginUser(user, LocalDateTime.now()); - return loginUser; + return user; } /** diff --git a/src/main/java/com/genersoft/iot/vmp/conf/security/WebSecurityConfig.java b/src/main/java/com/genersoft/iot/vmp/conf/security/WebSecurityConfig.java index c700b8c..be2850f 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/security/WebSecurityConfig.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/security/WebSecurityConfig.java @@ -18,8 +18,13 @@ import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.CorsConfigurationSource; +import org.springframework.web.cors.CorsUtils; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; -import java.util.List; +import java.util.ArrayList; +import java.util.Arrays; /** * 閰嶇疆Spring Security @@ -61,12 +66,6 @@ @Autowired private JwtAuthenticationFilter jwtAuthenticationFilter; -// @Bean -// JwtAuthenticationFilter jwtAuthenticationFilter() throws Exception { -// JwtAuthenticationFilter jwtAuthenticationFilter = new JwtAuthenticationFilter(authenticationManager()); -// return jwtAuthenticationFilter; -// } - /** * 鎻忚堪: 闈欐�佽祫婧愭斁琛岋紝杩欓噷鐨勬斁琛岋紝鏄笉璧� Spring Security 杩囨护鍣ㄩ摼 @@ -77,27 +76,19 @@ if (!userSetting.isInterfaceAuthentication()) { web.ignoring().antMatchers("**"); }else { + ArrayList<String> matchers = new ArrayList<>(); + matchers.add("/"); + matchers.add("/#/**"); + matchers.add("/static/**"); + matchers.add("/index.html"); + matchers.add("/doc.html"); + matchers.add("/webjars/**"); + matchers.add("/swagger-resources/**"); + matchers.add("/v3/api-docs/**"); + matchers.add("/js/**"); + matchers.addAll(userSetting.getInterfaceAuthenticationExcludes()); // 鍙互鐩存帴璁块棶鐨勯潤鎬佹暟鎹� - web.ignoring() - .antMatchers("/") - .antMatchers("/#/**") - .antMatchers("/static/**") - .antMatchers("/index.html") - .antMatchers("/doc.html") // "/webjars/**", "/swagger-resources/**", "/v3/api-docs/**" - .antMatchers("/webjars/**") - .antMatchers("/swagger-resources/**") - .antMatchers("/v3/api-docs/**") - .antMatchers("/favicon.ico") - .antMatchers("/js/**"); - List<String> interfaceAuthenticationExcludes = userSetting.getInterfaceAuthenticationExcludes(); - for (String interfaceAuthenticationExclude : interfaceAuthenticationExcludes) { - if (interfaceAuthenticationExclude.split("/").length < 4 ) { - logger.warn("{}涓嶆弧瓒充袱绾х洰褰曪紝宸插拷鐣�", interfaceAuthenticationExclude); - }else { - web.ignoring().antMatchers(interfaceAuthenticationExclude); - } - - } + web.ignoring().antMatchers(matchers.toArray(new String[0])); } } @@ -121,7 +112,7 @@ @Override protected void configure(HttpSecurity http) throws Exception { http.headers().contentTypeOptions().disable() - .and().cors() + .and().cors().configurationSource(configurationSource()) .and().csrf().disable() .sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.STATELESS) @@ -129,50 +120,36 @@ // 閰嶇疆鎷︽埅瑙勫垯 .and() .authorizeRequests() + .requestMatchers(CorsUtils::isPreFlightRequest).permitAll() + .antMatchers(userSetting.getInterfaceAuthenticationExcludes().toArray(new String[0])).permitAll() .antMatchers("/api/user/login","/index/hook/**").permitAll() .anyRequest().authenticated() // 寮傚父澶勭悊鍣� .and() .exceptionHandling() .authenticationEntryPoint(anonymousAuthenticationEntryPoint) -// .accessDeniedHandler(jwtAccessDeniedHandler) - // 閰嶇疆鑷畾涔夌殑杩囨护鍣� -// .and() -// .addFilter(jwtAuthenticationFilter) - // 楠岃瘉鐮佽繃婊ゅ櫒鏀惧湪UsernamePassword杩囨护鍣ㄤ箣鍓� -// .addFilterBefore(captchaFilter, UsernamePasswordAuthenticationFilter.class) + .and().logout().logoutUrl("/api/user/logout").permitAll() + .logoutSuccessHandler(logoutHandler) ; http.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); -// // 璁剧疆鍏佽娣诲姞闈欐�佹枃浠� -// http.headers().contentTypeOptions().disable(); -// http.authorizeRequests() -// // 鏀捐鎺ュ彛 -// .antMatchers("/api/user/login","/index/hook/**").permitAll() -// // 闄や笂闈㈠鐨勬墍鏈夎姹傚叏閮ㄩ渶瑕侀壌鏉冭璇� -// .anyRequest().authenticated() -// // 绂佺敤session -// .and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) -// // 寮傚父澶勭悊(鏉冮檺鎷掔粷銆佺櫥褰曞け鏁堢瓑) -// .and().exceptionHandling() -// // 鍖垮悕鐢ㄦ埛璁块棶鏃犳潈闄愯祫婧愭椂鐨勫紓甯稿鐞� -// .authenticationEntryPoint(anonymousAuthenticationEntryPoint) -// // 鐧诲綍 鍏佽鎵�鏈夌敤鎴� -// .and().formLogin() -// // 鐧诲綍鎴愬姛澶勭悊閫昏緫 鍦ㄨ繖閲岀粰鍑篔WT -// .successHandler(loginSuccessHandler) -// // 鐧诲綍澶辫触澶勭悊閫昏緫 -// .failureHandler(loginFailureHandler) -// // 鐧诲嚭 -// .and().logout().logoutUrl("/api/user/logout").permitAll() -// // 鐧诲嚭鎴愬姛澶勭悊閫昏緫 -// .logoutSuccessHandler(logoutHandler) -// // 閰嶇疆鑷畾涔夌殑杩囨护鍣� -// .and() -// .addFilter(jwtAuthenticationFilter()) -// ; } + CorsConfigurationSource configurationSource(){ + // 閰嶇疆璺ㄥ煙 + CorsConfiguration corsConfiguration = new CorsConfiguration(); + corsConfiguration.setAllowedHeaders(Arrays.asList("*")); + corsConfiguration.setAllowedMethods(Arrays.asList("*")); + corsConfiguration.setMaxAge(3600L); + corsConfiguration.setAllowCredentials(true); + corsConfiguration.setAllowedOrigins(userSetting.getAllowedOrigins()); + corsConfiguration.setExposedHeaders(Arrays.asList(JwtUtils.getHeader())); + + UrlBasedCorsConfigurationSource url = new UrlBasedCorsConfigurationSource(); + url.registerCorsConfiguration("/**",corsConfiguration); + return url; + } + /** * 鎻忚堪: 瀵嗙爜鍔犲瘑绠楁硶 BCrypt 鎺ㄨ崘浣跨敤 **/ diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/bean/WVPResult.java b/src/main/java/com/genersoft/iot/vmp/vmanager/bean/WVPResult.java index 6ad1ed7..d293b8d 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/bean/WVPResult.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/bean/WVPResult.java @@ -28,6 +28,10 @@ return new WVPResult<>(ErrorCode.SUCCESS.getCode(), msg, t); } + public static WVPResult success() { + return new WVPResult<>(ErrorCode.SUCCESS.getCode(), ErrorCode.SUCCESS.getMsg(), null); + } + public static <T> WVPResult<T> success(T t) { return success(t, ErrorCode.SUCCESS.getMsg()); } diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceConfig.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceConfig.java index eac68ca..544e345 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceConfig.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceConfig.java @@ -31,7 +31,6 @@ import java.util.UUID; @Tag(name = "鍥芥爣璁惧閰嶇疆") - @RestController @RequestMapping("/api/device/config") public class DeviceConfig { diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java index 7a8732c..d0accf4 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java @@ -24,6 +24,7 @@ import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import org.apache.commons.compress.utils.IOUtils; +import org.apache.ibatis.annotations.Options; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -97,8 +98,10 @@ @Parameter(name = "page", description = "褰撳墠椤�", required = true) @Parameter(name = "count", description = "姣忛〉鏌ヨ鏁伴噺", required = true) @GetMapping("/devices") + @Options() public PageInfo<Device> devices(int page, int count){ - +// if (page == null) page = 0; +// if (count == null) count = 20; return storager.queryVideoDeviceList(page, count,null); } diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/server/ServerController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/server/ServerController.java index ad2c13b..88126ac 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/server/ServerController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/server/ServerController.java @@ -23,7 +23,6 @@ import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.util.ObjectUtils; import org.springframework.web.bind.annotation.*; @@ -69,9 +68,6 @@ @Value("${server.port}") private int serverPort; - - @Autowired - private ThreadPoolTaskExecutor taskExecutor; @Autowired private IRedisCatchStorage redisCatchStorage; diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/user/UserController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/user/UserController.java index 826dd51..035f380 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/user/UserController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/user/UserController.java @@ -27,7 +27,6 @@ import java.util.List; @Tag(name = "鐢ㄦ埛绠$悊") - @RestController @RequestMapping("/api/user") public class UserController { @@ -47,7 +46,7 @@ @Parameter(name = "username", description = "鐢ㄦ埛鍚�", required = true) @Parameter(name = "password", description = "瀵嗙爜锛�32浣峬d5鍔犲瘑锛�", required = true) public LoginUser login(HttpServletRequest request, HttpServletResponse response, @RequestParam String username, @RequestParam String password){ - LoginUser user = null; + LoginUser user; try { user = SecurityUtils.login(username, password, authenticationManager); } catch (AuthenticationException e) { @@ -62,6 +61,25 @@ return user; } +// @GetMapping("/logout") +// @PostMapping("/logout") +// @Operation(summary = "鐧诲嚭") +// public LoginUser logout(){ +// LoginUser user; +// try { +// user = SecurityUtils.login(username, password, authenticationManager); +// } catch (AuthenticationException e) { +// throw new ControllerException(ErrorCode.ERROR100.getCode(), e.getMessage()); +// } +// if (user == null) { +// throw new ControllerException(ErrorCode.ERROR100.getCode(), "鐢ㄦ埛鍚嶆垨瀵嗙爜閿欒"); +// }else { +// String jwt = JwtUtils.createToken(username, password); +// response.setHeader(JwtUtils.getHeader(), jwt); +// } +// return user; +// } + @PostMapping("/changePassword") @Operation(summary = "淇敼瀵嗙爜") @Parameter(name = "username", description = "鐢ㄦ埛鍚�", required = true) diff --git a/src/main/resources/all-application.yml b/src/main/resources/all-application.yml index 3908019..3844971 100644 --- a/src/main/resources/all-application.yml +++ b/src/main/resources/all-application.yml @@ -201,6 +201,10 @@ sip-log: true # 鑷姩鏁版嵁搴撳崌绾э紝淇濊瘉琛ㄧ粨鏋勫畬鏁� sync-db: true + # 璺ㄥ煙閰嶇疆锛岄厤缃綘璁块棶鍓嶇椤甸潰鐨勫湴鍧�鍗冲彲锛� 鍙互閰嶇疆澶氫釜 + allowed-origins: + - http://localhost:8008 + - http://192.168.1.3:8008 # 鍏抽棴鍦ㄧ嚎鏂囨。锛堢敓浜х幆澧冨缓璁叧闂級 springdoc: diff --git a/web_src/package-lock.json b/web_src/package-lock.json index c6e972a..b8b9a8d 100644 --- a/web_src/package-lock.json +++ b/web_src/package-lock.json @@ -23,7 +23,7 @@ "vue-clipboard2": "^0.3.1", "vue-clipboards": "^1.3.0", "vue-contextmenujs": "^1.3.13", - "vue-cookies": "^1.7.4", + "vue-cookies": "^1.8.3", "vue-giant-tree": "^0.1.5", "vue-router": "^3.1.6", "vue-ztree-2.0": "^1.0.4" @@ -13135,9 +13135,9 @@ "integrity": "sha1-O9rgI8e9QgleeNpCWAACUNUKuO8=" }, "node_modules/vue-cookies": { - "version": "1.7.4", - "resolved": "https://registry.npm.taobao.org/vue-cookies/download/vue-cookies-1.7.4.tgz?cache=0&sync_timestamp=1598941352058&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-cookies%2Fdownload%2Fvue-cookies-1.7.4.tgz", - "integrity": "sha1-0kHQoEMdoHlYN2UdELTXPnyNPo0=" + "version": "1.8.3", + "resolved": "https://registry.npmmirror.com/vue-cookies/-/vue-cookies-1.8.3.tgz", + "integrity": "sha512-VBRsyRMVdahBgFfh389TMHPmDdr4URDJNMk4FKSCfuNITs7+jitBDhwyL4RJd3WUsfOYNNjPAkfbehyH9AFuoA==" }, "node_modules/vue-giant-tree": { "version": "0.1.5", @@ -25489,9 +25489,9 @@ "integrity": "sha1-O9rgI8e9QgleeNpCWAACUNUKuO8=" }, "vue-cookies": { - "version": "1.7.4", - "resolved": "https://registry.npm.taobao.org/vue-cookies/download/vue-cookies-1.7.4.tgz?cache=0&sync_timestamp=1598941352058&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-cookies%2Fdownload%2Fvue-cookies-1.7.4.tgz", - "integrity": "sha1-0kHQoEMdoHlYN2UdELTXPnyNPo0=" + "version": "1.8.3", + "resolved": "https://registry.npmmirror.com/vue-cookies/-/vue-cookies-1.8.3.tgz", + "integrity": "sha512-VBRsyRMVdahBgFfh389TMHPmDdr4URDJNMk4FKSCfuNITs7+jitBDhwyL4RJd3WUsfOYNNjPAkfbehyH9AFuoA==" }, "vue-giant-tree": { "version": "0.1.5", diff --git a/web_src/package.json b/web_src/package.json index 18b3332..dd4dfe6 100644 --- a/web_src/package.json +++ b/web_src/package.json @@ -25,7 +25,7 @@ "vue-clipboard2": "^0.3.1", "vue-clipboards": "^1.3.0", "vue-contextmenujs": "^1.3.13", - "vue-cookies": "^1.7.4", + "vue-cookies": "^1.8.3", "vue-giant-tree": "^0.1.5", "vue-router": "^3.1.6", "vue-ztree-2.0": "^1.0.4" diff --git a/web_src/src/App.vue b/web_src/src/App.vue index 4ae7ea8..e7d45b7 100644 --- a/web_src/src/App.vue +++ b/web_src/src/App.vue @@ -5,6 +5,7 @@ </template> <script> +import userService from './components/service/UserService' export default { name: 'app', data(){ @@ -19,7 +20,7 @@ } }, created() { - if(!this.$cookies.get("session")){ + if (userService.getToken() == null){ //濡傛灉娌℃湁鐧诲綍鐘舵�佸垯璺宠浆鍒扮櫥褰曢〉 this.$router.push('/login'); } @@ -33,28 +34,14 @@ // this.getUserInfo(); }, methods: { - //璇锋眰鐢ㄦ埛鐨勪竴浜涗俊鎭� - getUserInfo(){ - var userinfo = this.$cookies.get("session"); - }, checkLogin(){ //妫�鏌ユ槸鍚﹀瓨鍦╯ession - //cookie鎿嶄綔鏂规硶鍦ㄦ簮鐮侀噷鏈夋垨鑰呭弬鑰冪綉涓婄殑鍗冲彲 - if(!this.$cookies.get("session")){ + if (userService.getToken() == null){ //濡傛灉娌℃湁鐧诲綍鐘舵�佸垯璺宠浆鍒扮櫥褰曢〉 - this.$router.push('/login'); + // this.$router.push('/login'); } + }, - getCookie: function (cname) { - var name = cname + "="; - var ca = document.cookie.split(';'); - for (var i = 0; i < ca.length; i++) { - var c = ca[i]; - while (c.charAt(0) == ' ') c = c.substring(1); - if (c.indexOf(name) != -1) return c.substring(name.length, c.length); - } - return ""; - } }, components: {} }; diff --git a/web_src/src/components/Login.vue b/web_src/src/components/Login.vue index 37c8a83..64a3cbd 100644 --- a/web_src/src/components/Login.vue +++ b/web_src/src/components/Login.vue @@ -35,6 +35,7 @@ <script> import crypto from 'crypto' +import userService from "./service/UserService"; export default { name: 'Login', data(){ @@ -85,9 +86,10 @@ params: loginParam }).then(function (res) { window.clearTimeout(timeoutTask) - console.log(JSON.stringify(res)); + console.log(res); + console.log("鐧诲綍鎴愬姛"); if (res.data.code === 0 ) { - that.$cookies.set("session", {"username": that.username,"roleId":res.data.data.role.id}) ; + userService.setUser(res.data.data) //鐧诲綍鎴愬姛鍚� that.cancelEnterkeyDefaultAction(); that.$router.push('/'); @@ -105,14 +107,6 @@ that.$message.error(error.response.data.msg); that.isLoging = false; }); - }, - setCookie: function (cname, cvalue, exdays) { - var d = new Date(); - d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000)); - var expires = "expires=" + d.toUTCString(); - console.info(cname + "=" + cvalue + "; " + expires); - document.cookie = cname + "=" + cvalue + "; " + expires; - console.info(document.cookie); }, cancelEnterkeyDefaultAction: function() { document.onkeydown = function(e) { diff --git a/web_src/src/components/dialog/changePassword.vue b/web_src/src/components/dialog/changePassword.vue index 77e1d2a..5ab2d2f 100644 --- a/web_src/src/components/dialog/changePassword.vue +++ b/web_src/src/components/dialog/changePassword.vue @@ -35,6 +35,7 @@ <script> import crypto from 'crypto' +import userService from "../service/UserService"; export default { name: "changePassword", props: {}, @@ -105,7 +106,7 @@ this.showDialog = false; setTimeout(()=>{ // 鍒犻櫎cookie锛屽洖鍒扮櫥褰曢〉闈� - this.$cookies.remove("session"); + userService.clearUserInfo(); this.$router.push('/login'); this.sseSource.close(); },800) diff --git a/web_src/src/components/dialog/importChannel.vue b/web_src/src/components/dialog/importChannel.vue index 91611e8..e61b642 100644 --- a/web_src/src/components/dialog/importChannel.vue +++ b/web_src/src/components/dialog/importChannel.vue @@ -16,6 +16,7 @@ drag :action="uploadUrl" name="file" + :headers="headers" :on-success="successHook" :on-error="errorHook" > @@ -33,6 +34,8 @@ import ShowErrorData from './importChannelShowErrorData.vue' +import userService from "../service/UserService"; + export default { name: "importChannel", components: { @@ -47,7 +50,10 @@ isEdit: false, errorStreams: [], errorGBIds: [], - uploadUrl: process.env.NODE_ENV === 'development'?`debug/api/push/upload`:`api/push/upload`, + headers: { + "access-token": userService.getToken() + }, + uploadUrl: process.env.NODE_ENV === 'development'? `http://127.0.0.1:8080/debug/api/push/upload`: (window.baseUrl ? window.baseUrl : "") + `/api/push/upload`, }; }, methods: { diff --git a/web_src/src/components/service/UserService.js b/web_src/src/components/service/UserService.js new file mode 100644 index 0000000..0212dc8 --- /dev/null +++ b/web_src/src/components/service/UserService.js @@ -0,0 +1,42 @@ + +export default { + + /** + * 瀛樺偍鐢ㄦ埛淇℃伅 + * @param username + * @param token + */ + setUser(user){ + localStorage.setItem("wvp-user", JSON.stringify(user)); + }, + + /** + * 鑾峰彇鐢ㄦ埛 + */ + getUser(){ + return JSON.parse(localStorage.getItem("wvp-user")); + }, + + + /** + * 鑾峰彇鐧诲綍token + */ + getToken(){ + return localStorage.getItem("wvp-token"); + }, + + /** + * 娓呯悊鐢ㄦ埛淇℃伅 + */ + clearUserInfo(){ + localStorage.removeItem("wvp-user"); + localStorage.removeItem("wvp-token"); + }, + /** + * 鏇存柊token + * @param header + */ + setToken(token) { + localStorage.setItem("wvp-token", token); + } +} diff --git a/web_src/src/layout/UiHeader.vue b/web_src/src/layout/UiHeader.vue index fa9be3e..3e9cca0 100644 --- a/web_src/src/layout/UiHeader.vue +++ b/web_src/src/layout/UiHeader.vue @@ -23,9 +23,9 @@ <!-- </el-submenu>--> <!-- <el-menu-item style="float: right;" @click="loginout">閫�鍑�</el-menu-item>--> <el-submenu index="" style="float: right;"> - <template slot="title">娆㈣繋锛寋{ this.$cookies.get("session").username }}</template> + <template slot="title">娆㈣繋锛寋{ username }}</template> <el-menu-item @click="openDoc">鍦ㄧ嚎鏂囨。</el-menu-item> - <el-menu-item > + <el-menu-item> <el-switch v-model="alarmNotify" inactive-text="鎶ヨ淇℃伅鎺ㄩ��" @change="alarmNotifyChannge"></el-switch> </el-menu-item> <el-menu-item @click="changePassword">淇敼瀵嗙爜</el-menu-item> @@ -39,6 +39,7 @@ <script> import changePasswordDialog from '../components/dialog/changePassword.vue' +import userService from '../components/service/UserService' export default { name: "UiHeader", @@ -47,14 +48,17 @@ return { alarmNotify: false, sseSource: null, + username: userService.getUser().username, activeIndex: this.$route.path, - editUser: this.$cookies.get("session").roleId==1 + editUser: userService.getUser() ? userService.getUser().role.id === 1 : false }; }, created() { - console.log(this.$cookies.get("session")) + console.log(4444) + console.log(JSON.stringify(userService.getUser())) if (this.$route.path.startsWith("/channelList")) { this.activeIndex = "/deviceList" + } }, mounted() { @@ -69,10 +73,13 @@ method: 'get', url: "/api/user/logout" }).then((res) => { - // 鍒犻櫎cookie锛屽洖鍒扮櫥褰曢〉闈� - this.$cookies.remove("session"); + // 鍒犻櫎鐢ㄦ埛淇℃伅锛屽洖鍒扮櫥褰曢〉闈� + userService.clearUserInfo() this.$router.push('/login'); - this.sseSource.close(); + if (this.sseSource != null) { + this.sseSource.close(); + } + }).catch((error) => { console.error("鐧诲嚭澶辫触") console.error(error) @@ -151,16 +158,19 @@ </script> <style> #UiHeader .el-switch__label { - color: white ; + color: white; } + .el-menu--popup .el-menu-item .el-switch .el-switch__label { color: white !important; } -#UiHeader .el-switch__label.is-active{ + +#UiHeader .el-switch__label.is-active { color: #409EFF; } + #UiHeader .el-menu-item.is-active { - color: #fff!important; - background-color: #1890ff!important; + color: #fff !important; + background-color: #1890ff !important; } </style> diff --git a/web_src/src/main.js b/web_src/src/main.js index 91bbd47..a6c6e1b 100644 --- a/web_src/src/main.js +++ b/web_src/src/main.js @@ -1,5 +1,6 @@ import Vue from 'vue'; import App from './App.vue'; + Vue.config.productionTip = false; import ElementUI from 'element-ui'; import 'element-ui/lib/theme-chalk/index.css'; @@ -10,15 +11,16 @@ import VCharts from 'v-charts'; import VueClipboard from 'vue-clipboard2'; -import { Notification } from 'element-ui'; +import {Notification} from 'element-ui'; import Fingerprint2 from 'fingerprintjs2'; import VueClipboards from 'vue-clipboards'; import Contextmenu from "vue-contextmenujs" +import userService from "./components/service/UserService" // 鐢熸垚鍞竴ID -Fingerprint2.get(function(components) { - const values = components.map(function(component,index) { +Fingerprint2.get(function (components) { + const values = components.map(function (component, index) { if (index === 0) { //鎶婂井淇℃祻瑙堝櫒閲孶A鐨剋ifi鎴�4G绛夌綉缁滄浛鎹㈡垚绌�,涓嶇劧鍒囨崲缃戠粶浼欼D涓嶄竴鏍� return component.value.replace(/\bNetType\/\w+\b/, ''); } @@ -42,13 +44,17 @@ Vue.use(Contextmenu); Vue.use(VCharts); -axios.defaults.baseURL = (process.env.NODE_ENV === 'development') ? process.env.BASE_API : (window.baseUrl?window.baseUrl:""); +axios.defaults.baseURL = (process.env.NODE_ENV === 'development') ? process.env.BASE_API : (window.baseUrl ? window.baseUrl : ""); axios.defaults.withCredentials = true; // api 杩斿洖401鑷姩鍥炵櫥闄嗛〉闈� -axios.interceptors.response.use(function (response) { +axios.interceptors.response.use((response) => { // 瀵瑰搷搴旀暟鎹仛鐐逛粈涔� + let token = response.headers["access-token"]; + if (token) { + userService.setToken(token) + } return response; -}, function (error) { +}, (error) => { // 瀵瑰搷搴旈敊璇仛鐐逛粈涔� if (error.response.status === 401) { console.log("Received 401 Response") @@ -56,10 +62,22 @@ } return Promise.reject(error); }); +axios.interceptors.request.use( + config => { + if (userService.getToken() != null && config.url !== "/api/user/login") { + config.headers['access-token'] = `${userService.getToken()}`; + } + return config; + }, + error => { + return Promise.reject(error); + } +); + Vue.prototype.$axios = axios; Vue.prototype.$cookies.config(60*30); new Vue({ - router: router, - render: h => h(App), + router: router, + render: h => h(App), }).$mount('#app') -- Gitblit v1.8.0