From ebcc7c72663ae90d8960a6b027e26425e0a869e1 Mon Sep 17 00:00:00 2001
From: jiaosong <jiaosong6760@dingtalk.com>
Date: 星期三, 20 九月 2023 18:00:58 +0800
Subject: [PATCH] #批量上传
---
server/company/src/main/java/com/doumee/config/shiro/ShiroAuthFilter.java | 125 ++++++++++++++++++++++++++++++++++++++++-
1 files changed, 120 insertions(+), 5 deletions(-)
diff --git a/server/company/src/main/java/com/doumee/config/shiro/ShiroAuthFilter.java b/server/company/src/main/java/com/doumee/config/shiro/ShiroAuthFilter.java
index 30d7dc0..28b01dc 100644
--- a/server/company/src/main/java/com/doumee/config/shiro/ShiroAuthFilter.java
+++ b/server/company/src/main/java/com/doumee/config/shiro/ShiroAuthFilter.java
@@ -2,12 +2,23 @@
import com.alibaba.fastjson.JSON;
import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.utils.Constants;
+import org.apache.shiro.cache.Cache;
+import org.apache.shiro.cache.MapCache;
+import org.apache.shiro.session.Session;
+import org.apache.shiro.session.mgt.DefaultSessionKey;
+import org.apache.shiro.session.mgt.SessionManager;
+import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
import org.springframework.http.HttpStatus;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
+import java.io.Serializable;
+import java.util.Deque;
+import java.util.LinkedList;
/**
* Shiro璁よ瘉杩囨护鍣紝澶勭悊鏈璇佹儏鍐电殑鍝嶅簲
@@ -16,15 +27,119 @@
*/
public class ShiroAuthFilter extends FormAuthenticationFilter {
- public ShiroAuthFilter() {
+ public ShiroAuthFilter(SessionManager sessionManager,ShiroCacheManager shiroCacheManager) {
super();
+ this.sessionManager = (ShiroSessionManager)sessionManager;
+ this.cache = shiroCacheManager.getCache("shiro_redis_cache");
}
+ @Override
+ protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
+ return false;
+ }
+
+ private int maxSession = 1; //鏈�澶т細璇濇暟閲�
+
+ private boolean kickOutAfter = false; //韪㈠嚭鍓嶈�呰繕鏄悗鑰�
+ private Cache<String, Deque<Serializable>> cache; //缂撳瓨绠$悊
+
+
+ private ShiroSessionManager sessionManager; //浼氳瘽绠$悊
@Override
protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
- HttpServletResponse servletResponse = (HttpServletResponse) response;
- servletResponse.setHeader("content-type", "application/json;charset=UTF-8");
- servletResponse.getWriter().write(JSON.toJSONString(ApiResponse.failed(HttpStatus.UNAUTHORIZED.value(), "鏈櫥褰曟垨鐧诲綍淇℃伅宸茶繃鏈�")));
- return Boolean.FALSE;
+ Subject subject = getSubject(request, response);
+ if (!subject.isAuthenticated() && !subject.isRemembered()) { //濡傛灉涓嶆槸璁よ瘉杩囧拰璁颁綇瀵嗙爜鐨勶紝灏辩洿鎺ユ斁琛岃姹傦紝閬垮厤閫犳垚璁块棶杩囨參
+ // return Boolean.TRUE;
+ }
+ Session session = subject.getSession(); //鑾峰彇浼氳瘽session
+ Object principal = subject.getPrincipal();
+ Serializable sessionId = session.getId();
+ LoginUserInfo userInfo = (LoginUserInfo) principal;
+ if(userInfo == null ){
+ HttpServletResponse servletResponse = (HttpServletResponse) response;
+ servletResponse.setHeader("content-type", "application/json;charset=UTF-8");
+ servletResponse.getWriter().write(JSON.toJSONString(ApiResponse.failed(HttpStatus.UNAUTHORIZED.value(), "鏈櫥褰曟垨鐧诲綍淇℃伅宸茶繃鏈�")));
+ return Boolean.FALSE;
+// return super.onAccessDenied(request,response);
+ }else if( Constants.equalsInteger(userInfo.getType(), Constants.UserType.COMPANY.getKey()) ){
+ return Boolean.TRUE;
+// return super.onAccessDenied(request,response);
+ }
+
+ String userName = userInfo.getCompanyId() +"_"+ userInfo.getId();
+ Deque<Serializable> deque = cache.get(userName);
+ if (deque == null) {
+ deque = new LinkedList<>();
+ }
+ if (!deque.contains(sessionId) && session.getAttribute("kickOut") == null) {
+ deque.push(sessionId);
+ cache.put(userName, deque);
+ }
+ while (deque.size() > maxSession) {
+ Serializable kickOutSessionId;
+ if (kickOutAfter) {
+ kickOutSessionId = deque.removeFirst();
+ cache.put(userName, deque);
+ } else {
+ kickOutSessionId = deque.removeLast();
+ cache.put(userName, deque);
+ }
+
+ try {
+ Session kickOutSession = sessionManager.getSession(new DefaultSessionKey(kickOutSessionId));
+ if (kickOutSession != null) {
+ kickOutSession.setAttribute("kickOut", Boolean.TRUE);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+// log.error("韪㈠嚭寮傚父鏈涪鍑�");
+ }
+ }
+
+ if (session!=null && session.getAttribute("kickOut") != null && (Boolean) session.getAttribute("kickOut") == true) {
+ try {
+ subject.logout();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ saveRequest(request);
+ HttpServletResponse servletResponse = (HttpServletResponse) response;
+ servletResponse.setHeader("content-type", "application/json;charset=UTF-8");
+ servletResponse.getWriter().write(JSON.toJSONString(ApiResponse.failed(HttpStatus.UNAUTHORIZED.value(), "鏈櫥褰曟垨鐧诲綍淇℃伅宸茶繃鏈�")));
+ return Boolean.FALSE;
+ }
+ return Boolean.TRUE;
+ }
+
+ public int getMaxSession() {
+ return maxSession;
+ }
+
+ public void setMaxSession(int maxSession) {
+ this.maxSession = maxSession;
+ }
+
+ public boolean isKickOutAfter() {
+ return kickOutAfter;
+ }
+
+ public void setKickOutAfter(boolean kickOutAfter) {
+ this.kickOutAfter = kickOutAfter;
+ }
+
+ public Cache<String, Deque<Serializable>> getCache() {
+ return cache;
+ }
+
+ public void setCache(Cache<String, Deque<Serializable>> cache) {
+ this.cache = cache;
+ }
+
+ public ShiroSessionManager getSessionManager() {
+ return sessionManager;
+ }
+
+ public void setSessionManager(ShiroSessionManager sessionManager) {
+ this.sessionManager = sessionManager;
}
}
--
Gitblit v1.9.3