|
|
@@ -44,62 +44,33 @@ public class JWTAuthenticationFilter extends OncePerRequestFilter {
|
|
|
this.userService = userService;
|
|
|
}
|
|
|
|
|
|
- // TODO 原登录jwtTokenUtil.parseToken(token)获得的是学号,门户是手机号
|
|
|
+ // 原登录jwtTokenUtil.parseToken(token)获得的是学号,门户是手机号
|
|
|
@Override
|
|
|
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
|
|
|
throws ServletException, IOException {
|
|
|
String token = request.getHeader("Authorization");
|
|
|
- log.info("从Header中解析出Token:" + token);
|
|
|
+ log.info("doFilterInternal get token: {}", token);
|
|
|
|
|
|
try {
|
|
|
- if (token != null) {
|
|
|
- // 注意提取到的是手机号
|
|
|
- String phone = jwtTokenUtil.parseToken(token);
|
|
|
- log.info("解析出phone:" + phone);
|
|
|
- Map<String, Object> userInfoMap = jwtTokenUtil.parseClaim(token).getBody().get("user_info", Map.class);
|
|
|
-
|
|
|
- // 不为空则认为是门户请求
|
|
|
- if(userInfoMap != null){
|
|
|
- log.info("解析出的用户信息:{}", userInfoMap.toString());
|
|
|
- //pid:门户用户id
|
|
|
- Integer pid = Integer.valueOf(userInfoMap.get("id").toString());
|
|
|
- String name = userInfoMap.get("name").toString();
|
|
|
- String email = userInfoMap.get("email").toString();
|
|
|
- String username = userInfoMap.get("username").toString();
|
|
|
- Role role = Role.valueOf(userInfoMap.get("role").toString());
|
|
|
- // 如果EAI数据库中没有该用户,则添加该用户
|
|
|
- if (!userService.userExists(pid)) {
|
|
|
- log.info("用户不存在,添加用户{}", phone);
|
|
|
- UserRegisterDTO reg = new UserRegisterDTO();
|
|
|
- reg.setPid(pid);
|
|
|
- reg.setOfficialEmail(email);
|
|
|
- reg.setOfficialNumber(username);
|
|
|
- reg.setPhone(phone);
|
|
|
- reg.setRole(role);
|
|
|
- reg.setName(name);
|
|
|
- reg.setPassword("no_password");
|
|
|
- userService.createUserByPortal(reg);
|
|
|
- } else {
|
|
|
- log.info("用户存在,更新用户{}", phone);
|
|
|
- // 否则更新用户信息
|
|
|
- UserUpdateDTO update = new UserUpdateDTO();
|
|
|
- update.setContentEmail(email);
|
|
|
- // 同时为账号添加对应权限
|
|
|
- update.setRole(role);
|
|
|
-// update.setPhone(phone);
|
|
|
- update.setOfficialNumber(username);
|
|
|
- userService.updateUserByPid(pid, update);
|
|
|
- }
|
|
|
- }
|
|
|
- UserDetails userDetails = userDetailService.loadUserByUsername(phone);
|
|
|
- log.info("解析出UserDetails:" + userDetails);
|
|
|
+ if(token == null) {
|
|
|
+ chain.doFilter(request, response);
|
|
|
+ }
|
|
|
|
|
|
- // 设置principal和权限
|
|
|
- UsernamePasswordAuthenticationToken authentication =
|
|
|
- new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
|
|
|
- SecurityContextHolder.getContext().setAuthentication(authentication);
|
|
|
+ String phone = jwtTokenUtil.parseToken(token);
|
|
|
+ Map<String, Object> userInfoMap = jwtTokenUtil.parseClaim(token).getBody().get("user_info", Map.class);
|
|
|
+ // 不为空则认为是门户请求,此时同步用户信息
|
|
|
+ if(userInfoMap != null){
|
|
|
+ syncUserInfo(userInfoMap, phone);
|
|
|
}
|
|
|
|
|
|
+ UserDetails userDetails = userDetailService.loadUserByUsername(phone);
|
|
|
+ log.info("doFilterInternal userDetails:{}", userDetails);
|
|
|
+
|
|
|
+ // 设置principal和权限
|
|
|
+ UsernamePasswordAuthenticationToken authentication =
|
|
|
+ new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
|
|
|
+ SecurityContextHolder.getContext().setAuthentication(authentication);
|
|
|
+
|
|
|
chain.doFilter(request, response);
|
|
|
} catch (CredentialsExpiredException e) {
|
|
|
// 将异常传递给AuthenticationEntryPoint处理(必要的步骤)
|
|
|
@@ -107,4 +78,34 @@ public class JWTAuthenticationFilter extends OncePerRequestFilter {
|
|
|
}
|
|
|
|
|
|
}
|
|
|
+
|
|
|
+ private void syncUserInfo(Map<String, Object> userInfoMap, String phone) {
|
|
|
+ log.info("syncUserInfo user info in token:{}", userInfoMap.toString());
|
|
|
+ Integer pid = Integer.valueOf(userInfoMap.get("id").toString());
|
|
|
+ String name = userInfoMap.get("name").toString();
|
|
|
+ String email = userInfoMap.get("email").toString();
|
|
|
+ String username = userInfoMap.get("username").toString();
|
|
|
+ Role role = Role.valueOf(userInfoMap.get("role").toString());
|
|
|
+ // 如果EAI数据库中没有该用户,则添加该用户
|
|
|
+ if (!userService.userExists(pid)) {
|
|
|
+ log.info("syncUserInfo user don't exist, add: {}", phone);
|
|
|
+ UserRegisterDTO reg = new UserRegisterDTO();
|
|
|
+ reg.setPid(pid);
|
|
|
+ reg.setOfficialEmail(email);
|
|
|
+ reg.setOfficialNumber(username);
|
|
|
+ reg.setPhone(phone);
|
|
|
+ reg.setRole(role);
|
|
|
+ reg.setName(name);
|
|
|
+ reg.setPassword("no_password");
|
|
|
+ userService.createUserByPortal(reg);
|
|
|
+ } else {
|
|
|
+ log.info("syncUserInfo user exist, update: {}", phone);
|
|
|
+ UserUpdateDTO update = new UserUpdateDTO();
|
|
|
+ update.setContentEmail(email);
|
|
|
+ update.setRole(role);
|
|
|
+ update.setPhone(phone);
|
|
|
+ update.setOfficialNumber(username);
|
|
|
+ userService.updateUserByPid(pid, update);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|