diff --git a/src/main/java/com/jsl/oa/config/JwtFilter.java b/src/main/java/com/jsl/oa/config/JwtFilter.java index bfa2883..5589cce 100644 --- a/src/main/java/com/jsl/oa/config/JwtFilter.java +++ b/src/main/java/com/jsl/oa/config/JwtFilter.java @@ -4,8 +4,8 @@ import com.google.gson.Gson; import com.jsl.oa.utils.ErrorCode; import com.jsl.oa.utils.JwtUtil; import com.jsl.oa.utils.ResultUtil; +import org.apache.shiro.authc.ExpiredCredentialsException; import org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter; -import org.jetbrains.annotations.NotNull; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; @@ -16,9 +16,9 @@ import javax.servlet.http.HttpServletRequest; *
* 用于JWT的过滤器 * - * @since v1.1.0 - * @version v1.1.0 * @author 筱锋xiao_lfeng + * @version v1.1.0 + * @since v1.1.0 */ public class JwtFilter extends BasicHttpAuthenticationFilter { @@ -27,8 +27,8 @@ public class JwtFilter extends BasicHttpAuthenticationFilter { *
* 判断用户Token是否存在,如果存在则进行验证 * - * @param request 请求 - * @param response 响应 + * @param request 请求 + * @param response 响应 * @param mappedValue 映射值 * @return {@link Boolean} */ @@ -51,20 +51,45 @@ public class JwtFilter extends BasicHttpAuthenticationFilter { *
* 当访问被拒绝时,会调用此方法 * - * @param request 请求 - * @param response 响应 + * @param request 请求 + * @param response 响应 * @param mappedValue 映射值 * @return {@link Boolean} * @throws Exception 异常 */ @Override - protected boolean onAccessDenied(ServletRequest request, @NotNull ServletResponse response, Object mappedValue) throws Exception { - Gson gson = new Gson(); - response.setContentType("application/json;charset=UTF-8"); - response.getWriter().println(gson.toJson(ResultUtil.error(ErrorCode.UNAUTHORIZED))); - return false; + protected boolean onAccessDenied(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception { + try { + // 尝试获取Authorization Header + String token = getAuthzHeader(request); + if (token == null || token.isEmpty()) { + // 未提供Token,拒绝访问 + Gson gson = new Gson(); + response.setContentType("application/json;charset=UTF-8"); + response.getWriter().println(gson.toJson(ResultUtil.error(ErrorCode.UNAUTHORIZED))); + return false; + } else { + // 解析Bearer后面的令牌 + token = token.replace("Bearer ", ""); + System.out.println(token); + if (JwtUtil.verify(token)) { + // Token验证通过 + return true; + } else { + // Token验证失败,抛出异常 + throw new ExpiredCredentialsException("Token已过期"); + } + } + } catch (ExpiredCredentialsException e) { + // 处理Token过期异常,返回自定义的JSON信息 + Gson gson = new Gson(); + response.setContentType("application/json;charset=UTF-8"); + response.getWriter().println(gson.toJson(ResultUtil.error(ErrorCode.TOKEN_EXPIRED))); + return false; + } } + /** *

获取Authorization Header

*
diff --git a/src/main/java/com/jsl/oa/config/shiro/ShiroConfiguration.java b/src/main/java/com/jsl/oa/config/shiro/ShiroConfiguration.java index b1779e2..1f7332c 100644 --- a/src/main/java/com/jsl/oa/config/shiro/ShiroConfiguration.java +++ b/src/main/java/com/jsl/oa/config/shiro/ShiroConfiguration.java @@ -33,7 +33,7 @@ public class ShiroConfiguration { shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); // 设置未登陆响应接口 - shiroFilterFactoryBean.setLoginUrl("/unauthorized"); + shiroFilterFactoryBean.setUnauthorizedUrl("/unauthorized"); // 添加JWT过滤器 Map filters = new LinkedHashMap<>(); diff --git a/src/main/java/com/jsl/oa/exception/ProcessException.java b/src/main/java/com/jsl/oa/exception/ProcessException.java index 07dad93..950e305 100644 --- a/src/main/java/com/jsl/oa/exception/ProcessException.java +++ b/src/main/java/com/jsl/oa/exception/ProcessException.java @@ -2,16 +2,31 @@ package com.jsl.oa.exception; import com.jsl.oa.utils.BaseResponse; import com.jsl.oa.utils.ResultUtil; +import org.jetbrains.annotations.NotNull; import org.springframework.http.ResponseEntity; import org.springframework.web.HttpRequestMethodNotSupportedException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; +import java.sql.SQLIntegrityConstraintViolationException; +import java.util.regex.Pattern; + @ControllerAdvice public class ProcessException { @ExceptionHandler(value = HttpRequestMethodNotSupportedException.class) - public ResponseEntity methodNotAllowedException() { + public ResponseEntity businessMethodNotAllowedException() { return ResultUtil.error("MethodNotAllowed", 405, "请求方法错误"); } + + @ExceptionHandler(value = SQLIntegrityConstraintViolationException.class) + public ResponseEntity businessSQLIntegrityConstraintViolationException(@NotNull SQLIntegrityConstraintViolationException e) { + if (Pattern.matches(".*Duplicate entry.*", e.getMessage())) { + return ResultUtil.error("DuplicateEntry", 400, "数据重复"); + } else if (Pattern.matches(".*Cannot delete or update a parent row: a foreign key constraint fails.*", e.getMessage())) { + return ResultUtil.error("DataAssociation", 400, "数据存在关联,无法删除"); + } else { + return ResultUtil.error("DatabaseError", 400, "数据库异常"); + } + } } diff --git a/src/main/java/com/jsl/oa/mapper/UserMapper.java b/src/main/java/com/jsl/oa/mapper/UserMapper.java index 0b5dce9..abebecd 100644 --- a/src/main/java/com/jsl/oa/mapper/UserMapper.java +++ b/src/main/java/com/jsl/oa/mapper/UserMapper.java @@ -30,17 +30,23 @@ public interface UserMapper { @Select("SELECT * FROM organize_oa.oa_user WHERE job_id = #{jobId}") UserDO login(UserLoginVO userLoginVO); - @Update("update organize_oa.oa_user set enabled = 0 where id = #{id} ") + @Update("UPDATE organize_oa.oa_user SET enabled = 0 WHERE id = #{id} ") void userDelete(UserDeleteVO userDeleteVO); - @Update("update organize_oa.oa_user set account_no_locked = 1 where id = #{id} ") + @Update("UPDATE organize_oa.oa_user SET account_no_locked = 1 WHERE id = #{id} ") void userLock(UserLockVO userLockVO); - @Select("select * from organize_oa.oa_user where id = #{id}") + @Select("SELECT * FROM organize_oa.oa_user WHERE id = #{id}") UserDO getUserById(Long id); - @Select("select * from organize_oa.oa_user where email = #{email}") + @Select("SELECT * FROM organize_oa.oa_user WHERE email = #{email}") UserDO getUserInfoByEmail(String email); + @Select("SELECT * FROM organize_oa.oa_user WHERE phone = #{phone}") + UserDO getUserInfoByPhone(String user); + + @Select("SELECT * FROM organize_oa.oa_user WHERE job_id = #{jobId}") + UserDO getUserByJobId(String user); + void userEditProfile(UserEditProfile userEditProfile); } diff --git a/src/main/java/com/jsl/oa/services/impl/UserServiceImpl.java b/src/main/java/com/jsl/oa/services/impl/UserServiceImpl.java index b8b6932..e84ce34 100644 --- a/src/main/java/com/jsl/oa/services/impl/UserServiceImpl.java +++ b/src/main/java/com/jsl/oa/services/impl/UserServiceImpl.java @@ -10,6 +10,7 @@ import com.jsl.oa.utils.BaseResponse; import com.jsl.oa.utils.ErrorCode; import com.jsl.oa.utils.ResultUtil; import lombok.RequiredArgsConstructor; +import org.jetbrains.annotations.NotNull; import org.mindrot.jbcrypt.BCrypt; import org.springframework.stereotype.Service; @@ -34,7 +35,7 @@ public class UserServiceImpl implements UserService { } @Override - public BaseResponse userLock(UserLockVO userLockVO) { + public BaseResponse userLock(@NotNull UserLockVO userLockVO) { //判断用户是否存在 if(userDAO.isExistUser(userLockVO.getId())) { userDAO.userLock(userLockVO); @@ -43,7 +44,7 @@ public class UserServiceImpl implements UserService { } @Override - public BaseResponse userEditProfile(UserEditProfile userEditProfile) { + public BaseResponse userEditProfile(@NotNull UserEditProfile userEditProfile) { if(userDAO.isExistUser(userEditProfile.getId())) { if(userEditProfile.getPassword()!=null){ userEditProfile.setPassword(BCrypt.hashpw(userEditProfile.getPassword(), BCrypt.gensalt())); diff --git a/src/main/java/com/jsl/oa/utils/ErrorCode.java b/src/main/java/com/jsl/oa/utils/ErrorCode.java index a13ea59..1cb31de 100644 --- a/src/main/java/com/jsl/oa/utils/ErrorCode.java +++ b/src/main/java/com/jsl/oa/utils/ErrorCode.java @@ -11,6 +11,7 @@ public enum ErrorCode { TIMESTAMP_ERROR("TimestampError", 40014, "时间戳错误"), USER_NOT_EXIST("UserNotExist", 40015, "用户不存在"), UNAUTHORIZED("Unauthorized", 40100, "未授权"), + TOKEN_EXPIRED("TokenExpired", 40101, "Token已过期"), DATABASE_INSERT_ERROR("DatabaseInsertError", 50010, "数据库插入错误"), DATABASE_UPDATE_ERROR("DatabaseUpdateError", 50011, "数据库更新错误"), DATABASE_DELETE_ERROR("DatabaseDeleteError", 50012, "数据库删除错误");