优化登录逻辑,性能提升

This commit is contained in:
thinkgem
2025-10-11 21:52:58 +08:00
parent 9608ff2962
commit 0019e72f39
4 changed files with 51 additions and 43 deletions

View File

@@ -269,17 +269,17 @@ public class FormFilter extends org.apache.shiro.web.filter.authc.FormAuthentica
if (Global.getPropertyToBoolean("shiro.isGenerateNewSessionAfterLogin", "false")){
String[] keys = new String[] { ValidCodeUtils.VALID_CODE };
Map<String, Object> attrMap = MapUtils.newHashMap();
final Session sessionOld = UserUtils.getSession();
final Session oldSession = UserUtils.getSession();
for (String key : keys) {
Object value = sessionOld.getAttribute(key);
Object value = oldSession.getAttribute(key);
if (value != null) {
attrMap.put(key, value);
}
}
UserUtils.getSubject().logout();
// 恢复生成新的Session之前的Session数据
final Session sessionNew = UserUtils.getSession();
attrMap.forEach(sessionNew::setAttribute);
final Session newSession = UserUtils.getSession();
attrMap.forEach(newSession::setAttribute);
}
return super.executeLogin(request, response);
}
@@ -291,13 +291,15 @@ public class FormFilter extends org.apache.shiro.web.filter.authc.FormAuthentica
try {
return instance.onLoginSuccess(null, null, request, response);
} catch (Exception e) {
e.printStackTrace();
logger.error(e.getMessage(), e);
}
return false;
}
/**
* 登录成功调用事件
* @param token 通过 onLoginSuccess 静态方法调用时可能为空
* @param subject 通过 onLoginSuccess 静态方法调用时可能为空
*/
@Override
protected boolean onLoginSuccess(AuthenticationToken token, Subject subject, ServletRequest servletRequest, ServletResponse response) throws Exception {
@@ -316,16 +318,18 @@ public class FormFilter extends org.apache.shiro.web.filter.authc.FormAuthentica
/**
* 登录失败调用事件(静态方便其他位置调用)
*/
@SuppressWarnings("UnusedReturnValue")
public static boolean onLoginFailure(AuthenticationException e, HttpServletRequest request, HttpServletResponse response) {
return instance.onLoginFailure(null, e, request, response);
}
/**
* 登录失败调用事件
* @param token 通过 onLoginFailure 静态方法调用时可能为空
*/
@Override
protected boolean onLoginFailure(AuthenticationToken token, AuthenticationException e, ServletRequest request, ServletResponse response) {
String message = StringUtils.EMPTY;
String message;
if (e.getMessage() != null && StringUtils.startsWith(e.getMessage(), "msg:")) {
message = StringUtils.replace(e.getMessage(), "msg:", "");
} else if (e instanceof IncorrectCredentialsException || e instanceof UnknownAccountException) {

View File

@@ -8,6 +8,7 @@ import com.jeesite.common.codec.EncodeUtils;
import com.jeesite.common.codec.SM3Utils;
import com.jeesite.common.codec.ShaUtils;
import com.jeesite.common.config.Global;
import com.jeesite.common.network.IpUtils;
import com.jeesite.common.shiro.authc.FormToken;
import com.jeesite.common.utils.SpringUtils;
import com.jeesite.modules.sys.entity.Log;
@@ -20,8 +21,8 @@ import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import java.util.Date;
/**
* 系统认证授权实现类
@@ -70,8 +71,8 @@ public class AuthorizingRealm extends BaseAuthorizingRealm {
* 获取用户授权信息,默认返回类型 SimpleAuthorizationInfo
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(LoginInfo loginInfo, Subject subject, Session session, User user) {
return super.doGetAuthorizationInfo(loginInfo, subject, session, user);
protected AuthorizationInfo doGetAuthorizationInfo(LoginInfo loginInfo, User user) {
return super.doGetAuthorizationInfo(loginInfo, user);
}
/**
@@ -116,13 +117,20 @@ public class AuthorizingRealm extends BaseAuthorizingRealm {
@Override
public void onLoginSuccess(LoginInfo loginInfo, HttpServletRequest request) {
super.onLoginSuccess(loginInfo, request);
// 更新登录IP、时间、会话ID等
User user = UserUtils.get(loginInfo.getId());
user.setOldLastLoginIp(user.getLastLoginIp());
user.setOldLastLoginDate(user.getLastLoginDate());
user.setLastLoginIp(IpUtils.getRemoteAddr(request));
user.setLastLoginDate(new Date());
getUserService().updateUserLoginInfo(user);
// 记录用户登录日志
LogUtils.saveLog(user, request, "系统登录", Log.TYPE_LOGIN_LOGOUT);
// 登录成功后,验证码计算器清零
BaseAuthorizingRealm.isValidCodeLogin(user.getLoginCode(), user.getCorpCode_(), loginInfo.getParam("deviceType"), "success");
}
@Override

View File

@@ -25,8 +25,6 @@ import org.apache.shiro.realm.ldap.DefaultLdapRealm;
import org.apache.shiro.realm.ldap.JndiLdapContextFactory;
import org.apache.shiro.realm.ldap.LdapContextFactory;
import org.apache.shiro.realm.ldap.LdapUtils;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
@@ -123,8 +121,8 @@ public class LdapAuthorizingRealm extends BaseAuthorizingRealm {
}
@Override
protected AuthorizationInfo doGetAuthorizationInfo(LoginInfo loginInfo, Subject subject, Session session, User user) {
return super.doGetAuthorizationInfo(loginInfo, subject, session, user);
protected AuthorizationInfo doGetAuthorizationInfo(LoginInfo loginInfo, User user) {
return super.doGetAuthorizationInfo(loginInfo, user);
}
@Override

View File

@@ -53,9 +53,7 @@ public class LoginController extends BaseController{
public String login(HttpServletRequest request, HttpServletResponse response, Model model) {
// 地址中如果包含JSESSIONID则跳转一次去掉JSESSIONID信息。
if (StringUtils.containsIgnoreCase(request.getRequestURI(), ";JSESSIONID=")){
String queryString = request.getQueryString();
queryString = queryString == null ? "" : "?" + queryString;
ServletUtils.redirectUrl(request, response, adminPath + "/login" + queryString);
redirectUrl(request, response, "/login");
return null;
}
@@ -63,9 +61,7 @@ public class LoginController extends BaseController{
Subject subject = UserUtils.getSubject();
LoginInfo loginInfo = UserUtils.getLoginInfo(subject);
if(loginInfo != null){
String queryString = request.getQueryString();
queryString = queryString == null ? "" : "?" + queryString;
ServletUtils.redirectUrl(request, response, adminPath + "/index" + queryString);
redirectUrl(request, response, "/index");
return null;
}
@@ -109,12 +105,10 @@ public class LoginController extends BaseController{
// // 如果已经登录,则跳转到管理首页
// LoginInfo loginInfo = UserUtils.getLoginInfo();
// if(loginInfo != null){ // 注释掉,已经登录的账号,正常返回登录失败信息,方便前端判断。
// String queryString = request.getQueryString();
// queryString = queryString == null ? "" : "?" + queryString;
// ServletUtils.redirectUrl(request, response, adminPath + "/index" + queryString);
// redirectUrl(request, response, "/index");
// return null;
// }
// 获取登录失败数据
model.addAllAttributes(FormFilter.getLoginFailureData(request, response));
@@ -148,9 +142,7 @@ public class LoginController extends BaseController{
public String index(HttpServletRequest request, HttpServletResponse response, Model model) {
// 地址中如果包含JSESSIONID则跳转一次去掉JSESSIONID信息。
if (StringUtils.containsIgnoreCase(request.getRequestURI(), ";JSESSIONID=")){
String queryString = request.getQueryString();
queryString = queryString == null ? "" : "?" + queryString;
ServletUtils.redirectUrl(request, response, adminPath + "/index" + queryString);
redirectUrl(request, response, "/index");
return null;
}
@@ -159,37 +151,36 @@ public class LoginController extends BaseController{
LoginInfo loginInfo = UserUtils.getLoginInfo(subject);
if(loginInfo == null){
subject.logout();
String queryString = request.getQueryString();
queryString = queryString == null ? "" : "?" + queryString;
ServletUtils.redirectUrl(request, response, adminPath + "/login" + queryString);
redirectUrl(request, response, "/login");
return null;
}
// 当前用户对象信息
User user = UserUtils.get(loginInfo.getId());
if (user == null){
UserUtils.getSubject().logout();
String queryString = request.getQueryString();
queryString = queryString == null ? "" : "?" + queryString;
ServletUtils.redirectUrl(request, response, adminPath + "/login" + queryString);
subject.logout();
redirectUrl(request, response, "/login");
return null;
}
// 如果是登录操作,则初始化一些登录参数
Session session = UserUtils.getSession();
Session session = UserUtils.getSession(subject);
boolean isLogin = Global.TRUE.equals(session.getAttribute(BaseAuthorizingRealm.IS_LOGIN_OPER));
if (isLogin){
// 获取后接着清除,防止下次获取仍然认为是登录状态
// 清除登录状态,防止下次调用误认为是登录
session.removeAttribute(BaseAuthorizingRealm.IS_LOGIN_OPER);
// 设置共享SessionId的Cookie值第三方系统使用
String cookieName = Global.getProperty("session.shareSessionIdCookieName");
if (StringUtils.isNotBlank(cookieName)){
CookieUtils.setCookie(response, cookieName, (String)session.getId(), "/");
}
// 如果登录设置了语言,则切换语言
if (loginInfo.getParam("lang") != null){
Global.setLang(loginInfo.getParam("lang"), request, response);
}
// 根据当前用户子系统,切换到默认系统下
for(Role role : user.getRoleList()) {
if (role.getSysCodes() != null) {
@@ -209,12 +200,10 @@ public class LoginController extends BaseController{
}
}
// 验证下用户权限以便调用doGetAuthorizationInfo方法,保存单点登录登出句柄
// 验证下用户权限以便调用doGetAuthorizationInfo方法
else if (!subject.isPermitted("user")){
subject.logout();
String queryString = request.getQueryString();
queryString = queryString == null ? "" : "?" + queryString;
ServletUtils.redirectUrl(request, response, adminPath + "/login" + queryString);
redirectUrl(request, response, "/login");
return null;
}
@@ -311,7 +300,16 @@ public class LoginController extends BaseController{
// 返回主页面视图
return "modules/sys/sysIndex";
}
/**
* 带参数跳转地址
*/
private void redirectUrl(HttpServletRequest request, HttpServletResponse response, String url) {
String queryString = request.getQueryString();
queryString = queryString == null ? "" : "?" + queryString;
ServletUtils.redirectUrl(request, response, adminPath + url + queryString);
}
/**
* 侧边栏菜单数据
*/