登录拦截,返回信息方式修改。

This commit is contained in:
wangzhijiang
2022-03-10 18:14:01 +08:00
parent 993b79b8c9
commit ae2ac12ad5
2 changed files with 65 additions and 27 deletions
@@ -0,0 +1,46 @@
package com.jero.common.exception;
import com.google.gson.Gson;
import com.jero.common.api.vo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
@Slf4j
@Component
public class LoginException {
private static HttpServletResponse response;
@Autowired
public void setResponse(HttpServletResponse response){
this.response = response;
}
public static void loginException(Integer errorCode,String errorMessage){
String reponseJson = new Gson().toJson(Result.error(errorCode,errorMessage));
response.setContentType("application/json; charset=utf-8");
response.setCharacterEncoding("utf-8");
OutputStream out = null;
try {
out = response.getOutputStream();
out.write(reponseJson.getBytes());
}catch (IOException ex){
ex.printStackTrace();
}finally {
if(out != null){
try {
out.close();
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
log.error(errorMessage);
}
}
@@ -3,6 +3,8 @@ package com.jero.config.shiro;
import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.SecureUtil;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.jero.common.api.vo.Result; import com.jero.common.api.vo.Result;
import com.jero.common.exception.JeroBootException;
import com.jero.common.exception.LoginException;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationInfo;
@@ -47,8 +49,8 @@ public class ShiroRealm extends AuthorizingRealm {
@Resource @Resource
private RedisUtil redisUtil; private RedisUtil redisUtil;
@Autowired // @Autowired
private HttpServletResponse response; // private HttpServletResponse response;
/** /**
* 必须重写此方法,不然Shiro会报错 * 必须重写此方法,不然Shiro会报错
@@ -97,12 +99,13 @@ public class ShiroRealm extends AuthorizingRealm {
* @throws AuthenticationException * @throws AuthenticationException
*/ */
@Override @Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken auth) throws AuthenticationException { protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken auth){
log.debug("===============Shiro身份认证开始============doGetAuthenticationInfo=========="); log.debug("===============Shiro身份认证开始============doGetAuthenticationInfo==========");
String token = (String) auth.getCredentials(); String token = (String) auth.getCredentials();
if (token == null) { if (token == null) {
log.info("————————身份认证失败——————————IP地址: "+ oConvertUtils.getIpAddrByRequest(SpringContextUtils.getHttpServletRequest())); log.info("————————身份认证失败——————————IP地址: "+ oConvertUtils.getIpAddrByRequest(SpringContextUtils.getHttpServletRequest()));
throw new AuthenticationException("token为空!"); LoginException.loginException(401,"token为空");
//throw new JeroBootException("token为空!");
} }
// 校验token有效性 // 校验token有效性
LoginUser loginUser = this.checkUserTokenIsEffect(token); LoginUser loginUser = this.checkUserTokenIsEffect(token);
@@ -118,41 +121,30 @@ public class ShiroRealm extends AuthorizingRealm {
// 解密获得username,用于和数据库进行对比 // 解密获得username,用于和数据库进行对比
String username = JwtUtil.getUsername(token); String username = JwtUtil.getUsername(token);
if (username == null) { if (username == null) {
throw new AuthenticationException("token非法无效!"); LoginException.loginException(401,"token非法无效");
return null;
//throw new AuthenticationException("token非法无效!");
} }
// 查询用户信息 // 查询用户信息
log.debug("———校验token是否有效————checkUserTokenIsEffect——————— "+ token); log.debug("———校验token是否有效————checkUserTokenIsEffect——————— "+ token);
LoginUser loginUser = commonAPI.getUserByName(username); LoginUser loginUser = commonAPI.getUserByName(username);
if (loginUser == null) { if (loginUser == null) {
throw new AuthenticationException("用户不存在!"); LoginException.loginException(401,"用户不存在!");
return null;
//throw new AuthenticationException("用户不存在!");
} }
// 判断用户状态 // 判断用户状态
if (loginUser.getStatus() != 1) { if (loginUser.getStatus() != 1) {
throw new AuthenticationException("账号已被锁定,请联系管理员!"); LoginException.loginException(401,"账号已被锁定,请联系管理员!");
return null;
//throw new AuthenticationException("账号已被锁定,请联系管理员!");
} }
// 校验token是否超时失效 & 或者账号密码是否错误 // 校验token是否超时失效 & 或者账号密码是否错误
if (!jwtTokenRefresh(token, username, loginUser.getPassword())) { if (!jwtTokenRefresh(token, username, loginUser.getPassword())) {
String reponseJson = new Gson().toJson(Result.error(401,"Token失效,请重新登录!")); LoginException.loginException(401,"Token失效,请重新登录!");
response.setContentType("application/json; charset=utf-8"); return null;
response.setCharacterEncoding("utf-8"); //throw new AuthenticationException("Token失效,请重新登录!");
OutputStream out = null;
try {
out = response.getOutputStream();
out.write(reponseJson.getBytes());
}catch (IOException ex){
ex.printStackTrace();
}finally {
if(out != null){
try {
out.close();
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
throw new AuthenticationException("Token失效,请重新登录!");
} }
return loginUser; return loginUser;