1.部门邀请 2.app版本增加ssh上传,3.注册页面国际化适配

This commit is contained in:
zjf committed 2026-09-08 16:23:34 +08:00
1 parent 73b874382b
commit 0bde83e9c2
31 files changed
+1372 -61

No files matched your search

@@ -44,7 +44,14 @@ public class PermitAllUrlProperties implements InitializingBean {
private static final Pattern PATTERN = Pattern.compile("\\{(.*?)\\}");
private static final String[] DEFAULT_IGNORE_URLS = new String[]{"/actuator/**", "/error", "/v3/api-docs"};
private static final String[] DEFAULT_IGNORE_URLS = new String[]{
"/actuator/**",
"/error",
"/v3/api-docs",
// 部门邀请公开接口(免登录);写入默认白名单,避免仅依赖注解扫描遗漏
"/dept/invite/preview",
"/dept/invite/register"
};
@Getter
@Setter
@@ -70,18 +77,23 @@ public class PermitAllUrlProperties implements InitializingBean {
// 获取方法上边的注解 替代path variable 为 *
Inner method = AnnotationUtils.findAnnotation(handlerMethod.getMethod(), Inner.class);
Optional.ofNullable(method)
.ifPresent(inner -> Objects.requireNonNull(info.getPathPatternsCondition())
.getPatternValues()
.forEach(url -> ignoreUrls.add(ReUtil.replaceAll(url, PATTERN, "*"))));
Optional.ofNullable(method).ifPresent(inner -> addIgnoreUrls(info));
// 获取类上边的注解, 替代path variable 为 *
Inner controller = AnnotationUtils.findAnnotation(handlerMethod.getBeanType(), Inner.class);
Optional.ofNullable(controller)
.ifPresent(inner -> Objects.requireNonNull(info.getPathPatternsCondition())
.getPatternValues()
.forEach(url -> ignoreUrls.add(ReUtil.replaceAll(url, PATTERN, "*"))));
Optional.ofNullable(controller).ifPresent(inner -> addIgnoreUrls(info));
});
}
private void addIgnoreUrls(RequestMappingInfo info) {
Set<String> patterns = new HashSet<>();
if (info.getPathPatternsCondition() != null) {
patterns.addAll(info.getPathPatternsCondition().getPatternValues());
}
if (info.getPatternsCondition() != null) {
patterns.addAll(info.getPatternsCondition().getPatterns());
}
patterns.forEach(url -> ignoreUrls.add(ReUtil.replaceAll(url, PATTERN, "*")));
}
}
@@ -17,18 +17,22 @@
package com.bsd.pjcloud.common.security.service;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import com.bsd.pjcloud.admin.api.dto.UserInfo;
import com.bsd.pjcloud.admin.api.entity.SysUser;
import com.bsd.pjcloud.common.core.constant.CommonConstants;
import com.bsd.pjcloud.common.core.constant.SecurityConstants;
import com.bsd.pjcloud.common.core.constant.enums.UserTypeEnum;
import com.bsd.pjcloud.common.core.util.MsgUtils;
import com.bsd.pjcloud.common.security.util.OAuth2ErrorCodesExpand;
import org.springframework.core.Ordered;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.oauth2.core.OAuth2AuthenticationException;
import org.springframework.security.oauth2.core.OAuth2Error;
import java.util.*;
@@ -96,6 +100,16 @@ public interface PjcloudUserDetailsService extends UserDetailsService, Ordered {
Collection<? extends GrantedAuthority> authorities = AuthorityUtils
.createAuthorityList(dbAuthsSet.toArray(new String[0]));
SysUser user = info.getSysUser();
// 与 TaskCheckStatusEnum 对齐:审核中/拒绝不可登录(邀请注册等场景仅写 processStatus,不锁账号)
String processStatus = user.getProcessStatus();
if (StrUtil.equals(processStatus, "1")) {
throw new OAuth2AuthenticationException(new OAuth2Error(OAuth2ErrorCodesExpand.USER_PENDING_AUDIT,
MsgUtils.getSecurityMessage("AbstractUserDetailsAuthenticationProvider.pendingAudit"), ""));
}
if (StrUtil.equals(processStatus, "3")) {
throw new OAuth2AuthenticationException(new OAuth2Error(OAuth2ErrorCodesExpand.USER_AUDIT_REJECTED,
MsgUtils.getSecurityMessage("AbstractUserDetailsAuthenticationProvider.auditRejected"), ""));
}
// 构造security用户
return new PjcloudUser(user.getUserId(), user.getUsername(), user.getDeptId(), user.getPhone(), user.getAvatar(),
@@ -18,6 +18,12 @@ public interface OAuth2ErrorCodesExpand {
/** 用户禁用 */
String USER_DISABLE = "user_disable";
/** 用户审核中 */
String USER_PENDING_AUDIT = "user_pending_audit";
/** 用户审核拒绝 */
String USER_AUDIT_REJECTED = "user_audit_rejected";
/** 用户过期 */
String USER_EXPIRED = "user_expired";
@@ -7,6 +7,8 @@ AbstractUserDetailsAuthenticationProvider.credentialsExpired=Credentials have ex
OAuth2ResourceOwnerBaseAuthenticationProvider.tokenExpired=Credentials have expired
AbstractUserDetailsAuthenticationProvider.disabled=User is not activated
AbstractUserDetailsAuthenticationProvider.locked=User account is locked
AbstractUserDetailsAuthenticationProvider.pendingAudit=Account is pending approval. Please wait until approved before signing in
AbstractUserDetailsAuthenticationProvider.auditRejected=Account approval was rejected. Sign-in is not allowed
AbstractUserDetailsAuthenticationProvider.expired=User account has expired
JdbcDaoImpl.notFound=User {0} not found
UserDetailsService.notFound=User does not exist
@@ -29,6 +29,8 @@ OAuth2ResourceOwnerBaseAuthenticationProvider.tokenExpired=\u7528\u6237\u51ED\u8
AbstractUserDetailsAuthenticationProvider.disabled=\u7528\u6237\u672A\u6FC0\u6D3B
AbstractUserDetailsAuthenticationProvider.expired=\u7528\u6237\u5E10\u53F7\u5DF2\u8FC7\u671F
AbstractUserDetailsAuthenticationProvider.locked=\u7528\u6237\u5E10\u53F7\u5DF2\u88AB\u9501\u5B9A
AbstractUserDetailsAuthenticationProvider.pendingAudit=\u8D26\u53F7\u5BA1\u6838\u4E2D\uFF0C\u8BF7\u7B49\u5F85\u5BA1\u6279\u901A\u8FC7\u540E\u518D\u767B\u5F55
AbstractUserDetailsAuthenticationProvider.auditRejected=\u8D26\u53F7\u5BA1\u6838\u672A\u901A\u8FC7\uFF0C\u65E0\u6CD5\u767B\u5F55
AbstractUserDetailsAuthenticationProvider.onlySupports=\u4EC5\u4EC5\u652F\u6301UsernamePasswordAuthenticationToken
AbstractUserDetailsAuthenticationProvider.badTenantId=\u65E0\u6548\u7684\u79DF\u6237\u7F16\u53F7:{0}
AccountStatusUserDetailsChecker.credentialsExpired=\u7528\u6237\u51ED\u8BC1\u5DF2\u8FC7\u671F
@@ -7,6 +7,8 @@ AbstractUserDetailsAuthenticationProvider.credentialsExpired=用戶憑證已過
OAuth2ResourceOwnerBaseAuthenticationProvider.tokenExpired=用戶憑證已過期
AbstractUserDetailsAuthenticationProvider.disabled=用戶未啟用
AbstractUserDetailsAuthenticationProvider.locked=用戶帳號已鎖定
AbstractUserDetailsAuthenticationProvider.pendingAudit=帳號審核中,請等待審批通過後再登入
AbstractUserDetailsAuthenticationProvider.auditRejected=帳號審核未通過,無法登入
AbstractUserDetailsAuthenticationProvider.expired=用戶帳號已過期
JdbcDaoImpl.notFound=未找到用戶{0}
UserDetailsService.notFound=用戶不存在