UserToken问题
This commit is contained in:
parent
e4eeef017f
commit
05905f081f
@ -0,0 +1,48 @@
|
|||||||
|
package ink.wgink.login.oauth2.client.auth;
|
||||||
|
|
||||||
|
import ink.wgink.login.oauth2.client.auth.manager.UserToken;
|
||||||
|
import ink.wgink.pojo.bos.LoginUser;
|
||||||
|
import ink.wgink.pojo.bos.UserInfoBO;
|
||||||
|
import org.springframework.security.core.GrantedAuthority;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
public class UserTokenManager {
|
||||||
|
|
||||||
|
private static final UserTokenManager USER_TOKEN_MANAGER = Builder.USER_TOKEN_MANAGER;
|
||||||
|
private static final Map<String, UserToken> LOGIN_USER_MAP = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
private UserTokenManager() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UserTokenManager getInstance() {
|
||||||
|
return USER_TOKEN_MANAGER;
|
||||||
|
}
|
||||||
|
|
||||||
|
public UserToken get(String userId) {
|
||||||
|
return LOGIN_USER_MAP.get(userId);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void refresh(UserInfoBO userInfo, Set<GrantedAuthority> grantedAuthorities) {
|
||||||
|
LOGIN_USER_MAP.put(userInfo.getUserId(), new UserToken(userInfo.getUserId(), userInfo, grantedAuthorities, System.currentTimeMillis()));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void removeTimeout() {
|
||||||
|
Set<String> keySet = LOGIN_USER_MAP.keySet();
|
||||||
|
keySet.forEach(key -> {
|
||||||
|
UserToken userToken = LOGIN_USER_MAP.get(key);
|
||||||
|
if (userToken != null && userToken.getLastUpdateTime() + 3600 * 1000 < System.currentTimeMillis()) {
|
||||||
|
LOGIN_USER_MAP.remove(key);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class Builder {
|
||||||
|
public static UserTokenManager USER_TOKEN_MANAGER = new UserTokenManager();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,54 @@
|
|||||||
|
package ink.wgink.login.oauth2.client.auth.filter;
|
||||||
|
|
||||||
|
import com.alibaba.excel.util.StringUtils;
|
||||||
|
import ink.wgink.exceptions.SearchException;
|
||||||
|
import ink.wgink.login.oauth2.client.auth.UserTokenManager;
|
||||||
|
import ink.wgink.login.oauth2.client.auth.manager.UserToken;
|
||||||
|
import ink.wgink.pojo.bos.UserInfoBO;
|
||||||
|
import org.springframework.core.Ordered;
|
||||||
|
import org.springframework.core.annotation.Order;
|
||||||
|
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
||||||
|
import org.springframework.security.core.context.SecurityContext;
|
||||||
|
import org.springframework.security.core.context.SecurityContextHolder;
|
||||||
|
import org.springframework.security.core.context.SecurityContextHolderStrategy;
|
||||||
|
import org.springframework.security.web.context.SecurityContextRepository;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.springframework.web.filter.OncePerRequestFilter;
|
||||||
|
|
||||||
|
import javax.servlet.FilterChain;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.annotation.WebFilter;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@Order(value = Ordered.HIGHEST_PRECEDENCE)
|
||||||
|
@Component
|
||||||
|
@WebFilter(filterName = "ContentCachingFilter", urlPatterns = "/*")
|
||||||
|
public class UserTokenFilter extends OncePerRequestFilter {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
|
||||||
|
String userId = request.getHeader("X-USER-ID");
|
||||||
|
if (StringUtils.isBlank(userId)) {
|
||||||
|
filterChain.doFilter(request, response);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
UserTokenManager userTokenManager = UserTokenManager.getInstance();
|
||||||
|
UserToken userToken = userTokenManager.get(userId);
|
||||||
|
if (userToken == null) {
|
||||||
|
throw new SearchException("用户未登录,userId异常");
|
||||||
|
}
|
||||||
|
UserInfoBO userInfo = userToken.getUserInfo();
|
||||||
|
userTokenManager.refresh(userInfo, userToken.getGrantedAuthorities());
|
||||||
|
UsernamePasswordAuthenticationToken userAuthenticationTokenResult = new UsernamePasswordAuthenticationToken(userInfo, null, userToken.getGrantedAuthorities());
|
||||||
|
SecurityContextHolderStrategy securityContextHolderStrategy = SecurityContextHolder.getContextHolderStrategy();
|
||||||
|
SecurityContext context = securityContextHolderStrategy.createEmptyContext();
|
||||||
|
context.setAuthentication(userAuthenticationTokenResult);
|
||||||
|
securityContextHolderStrategy.setContext(context);
|
||||||
|
request.getSession().setAttribute("SPRING_SECURITY_CONTEXT", context);
|
||||||
|
filterChain.doFilter(request, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,58 @@
|
|||||||
|
package ink.wgink.login.oauth2.client.auth.manager;
|
||||||
|
|
||||||
|
import ink.wgink.pojo.bos.LoginUser;
|
||||||
|
import ink.wgink.pojo.bos.UserInfoBO;
|
||||||
|
import org.springframework.security.core.GrantedAuthority;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class UserToken {
|
||||||
|
|
||||||
|
private String userId;
|
||||||
|
private UserInfoBO userInfo;
|
||||||
|
private Set<GrantedAuthority> grantedAuthorities;
|
||||||
|
private long lastUpdateTime;
|
||||||
|
|
||||||
|
public UserToken() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public UserToken(String userId, UserInfoBO userInfo, Set<GrantedAuthority> grantedAuthorities, long lastUpdateTime) {
|
||||||
|
this.userId = userId;
|
||||||
|
this.userInfo = userInfo;
|
||||||
|
this.grantedAuthorities = grantedAuthorities;
|
||||||
|
this.lastUpdateTime = lastUpdateTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUserId() {
|
||||||
|
return userId == null ? "" : userId.trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUserId(String userId) {
|
||||||
|
this.userId = userId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public UserInfoBO getUserInfo() {
|
||||||
|
return userInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUserInfo(UserInfoBO userInfo) {
|
||||||
|
this.userInfo = userInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<GrantedAuthority> getGrantedAuthorities() {
|
||||||
|
return grantedAuthorities;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGrantedAuthorities(Set<GrantedAuthority> grantedAuthorities) {
|
||||||
|
this.grantedAuthorities = grantedAuthorities;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getLastUpdateTime() {
|
||||||
|
return lastUpdateTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLastUpdateTime(long lastUpdateTime) {
|
||||||
|
this.lastUpdateTime = lastUpdateTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,6 +1,8 @@
|
|||||||
package ink.wgink.login.oauth2.client.converter;
|
package ink.wgink.login.oauth2.client.converter;
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import ink.wgink.login.oauth2.client.auth.UserTokenManager;
|
||||||
|
import ink.wgink.pojo.bos.LoginUser;
|
||||||
import ink.wgink.pojo.bos.RoleGrantedAuthorityBO;
|
import ink.wgink.pojo.bos.RoleGrantedAuthorityBO;
|
||||||
import ink.wgink.pojo.bos.UserInfoBO;
|
import ink.wgink.pojo.bos.UserInfoBO;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
@ -51,6 +53,7 @@ public class OAuth2ClientUserAuthConverter implements UserAuthenticationConverte
|
|||||||
(List<String>) authMap.get("queries"));
|
(List<String>) authMap.get("queries"));
|
||||||
grantedAuthorities.add(roleGrantedAuthorityBO);
|
grantedAuthorities.add(roleGrantedAuthorityBO);
|
||||||
});
|
});
|
||||||
|
UserTokenManager.getInstance().refresh((UserInfoBO) principal, grantedAuthorities);
|
||||||
return new UsernamePasswordAuthenticationToken(principal, "N/A", grantedAuthorities);
|
return new UsernamePasswordAuthenticationToken(principal, "N/A", grantedAuthorities);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
Loading…
Reference in New Issue
Block a user