-
Notifications
You must be signed in to change notification settings - Fork 75
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #94 from jamebal/ocr
perf: 适配 onlyoffice JWT
- Loading branch information
Showing
5 changed files
with
246 additions
and
10 deletions.
There are no files selected for viewing
97 changes: 97 additions & 0 deletions
97
src/main/java/com/jmal/clouddisk/office/OfficeConfigService.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,97 @@ | ||
package com.jmal.clouddisk.office; | ||
|
||
import cn.hutool.core.codec.Base62; | ||
import cn.hutool.core.util.StrUtil; | ||
import cn.hutool.crypto.KeyUtil; | ||
import cn.hutool.crypto.symmetric.SymmetricAlgorithm; | ||
import cn.hutool.crypto.symmetric.SymmetricCrypto; | ||
import cn.hutool.jwt.JWT; | ||
import cn.hutool.jwt.signers.JWTSigner; | ||
import cn.hutool.jwt.signers.JWTSignerUtil; | ||
import com.jmal.clouddisk.office.model.OfficeConfigDO; | ||
import com.jmal.clouddisk.office.model.OfficeConfigDTO; | ||
import lombok.RequiredArgsConstructor; | ||
import org.springframework.data.mongodb.core.MongoTemplate; | ||
import org.springframework.data.mongodb.core.query.Query; | ||
import org.springframework.data.mongodb.core.query.Update; | ||
import org.springframework.stereotype.Service; | ||
|
||
import java.util.Map; | ||
|
||
@Service | ||
@RequiredArgsConstructor | ||
public class OfficeConfigService { | ||
|
||
public final static String VO_KEY = "****************"; | ||
|
||
private final MongoTemplate mongoTemplate; | ||
private volatile String officeServerSecret; | ||
|
||
private String getOfficeServerSecret() { | ||
if (officeServerSecret == null) { | ||
synchronized (this) { | ||
if (officeServerSecret == null) { | ||
OfficeConfigDO officeConfigDO = mongoTemplate.findOne(new Query(), OfficeConfigDO.class); | ||
if (officeConfigDO == null || officeConfigDO.getEncrypted() == null || officeConfigDO.getKey() == null) { | ||
officeServerSecret = ""; // 如果没有找到配置或配置不完整,设置为空字符串 | ||
} else { | ||
SymmetricCrypto symmetricCrypto = new SymmetricCrypto(SymmetricAlgorithm.AES, officeConfigDO.getKey().getBytes()); | ||
officeServerSecret = symmetricCrypto.decryptStr(officeConfigDO.getEncrypted()); | ||
} | ||
} | ||
} | ||
} | ||
return officeServerSecret; | ||
} | ||
|
||
public String createOfficeToken(final Map<String, Object> payloadClaims) { | ||
String key = getOfficeServerSecret(); | ||
if (StrUtil.isBlank(key)) { | ||
return ""; | ||
} | ||
final JWTSigner signer = JWTSignerUtil.hs256(getOfficeServerSecret().getBytes()); | ||
JWT jwt = JWT.create().addPayloads(payloadClaims); | ||
return jwt.sign(signer); | ||
} | ||
|
||
public OfficeConfigDTO getOfficeConfig() { | ||
OfficeConfigDO officeConfigDO = mongoTemplate.findOne(new Query(), OfficeConfigDO.class); | ||
if (officeConfigDO == null) { | ||
return new OfficeConfigDTO(); | ||
} | ||
return officeConfigDO.toOfficeConfigDTO(); | ||
} | ||
|
||
public void setOfficeConfig(OfficeConfigDTO officeConfigDTO) { | ||
OfficeConfigDO officeConfigDO = officeConfigDTO.toOfficeConfigDO(); | ||
Query query = new Query(); | ||
Update update = new Update() | ||
.set("documentServer", officeConfigDO.getDocumentServer()) | ||
.set("callbackServer", officeConfigDO.getCallbackServer()) | ||
.set("tokenEnabled", officeConfigDO.getTokenEnabled()) | ||
.set("format", officeConfigDO.getFormat()); | ||
if (!VO_KEY.equals(officeConfigDTO.getSecret())) { | ||
update.set("encrypted", officeConfigDO.getEncrypted()); | ||
update.set("key", officeConfigDO.getKey()); | ||
} | ||
mongoTemplate.upsert(query, update, OfficeConfigDO.class); | ||
|
||
// 重置缓存的密钥,使其在下次访问时重新加载 | ||
synchronized (this) { | ||
if (VO_KEY.equals(officeConfigDTO.getSecret())) { | ||
return; | ||
} | ||
if (StrUtil.isNotBlank(officeConfigDTO.getSecret())) { | ||
officeServerSecret = officeConfigDTO.getSecret(); | ||
} else { | ||
officeServerSecret = null; | ||
} | ||
} | ||
} | ||
|
||
public static String generateKey() { | ||
byte[] keyBytes = KeyUtil.generateKey(SymmetricAlgorithm.AES.getValue(), 256).getEncoded(); | ||
String base62Key = Base62.encode(keyBytes); | ||
return base62Key.length() > 32 ? base62Key.substring(0, 32) : base62Key; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
36 changes: 36 additions & 0 deletions
36
src/main/java/com/jmal/clouddisk/office/model/OfficeConfigDO.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
package com.jmal.clouddisk.office.model; | ||
|
||
import com.jmal.clouddisk.office.OfficeConfigService; | ||
import lombok.Data; | ||
import org.springframework.data.mongodb.core.mapping.Document; | ||
|
||
import java.util.List; | ||
|
||
@Data | ||
@Document(collection = "officeConfig") | ||
public class OfficeConfigDO { | ||
|
||
private String documentServer; | ||
|
||
private String callbackServer; | ||
|
||
private String encrypted; | ||
|
||
private String key; | ||
|
||
private Boolean tokenEnabled; | ||
|
||
private List<String> format; | ||
|
||
public OfficeConfigDTO toOfficeConfigDTO() { | ||
OfficeConfigDTO officeConfigDTO = new OfficeConfigDTO(); | ||
officeConfigDTO.setDocumentServer(this.documentServer); | ||
officeConfigDTO.setCallbackServer(this.callbackServer); | ||
officeConfigDTO.setFormat(this.format); | ||
officeConfigDTO.setTokenEnabled(this.tokenEnabled); | ||
if (this.tokenEnabled) { | ||
officeConfigDTO.setSecret(OfficeConfigService.VO_KEY); | ||
} | ||
return officeConfigDTO; | ||
} | ||
} |
63 changes: 63 additions & 0 deletions
63
src/main/java/com/jmal/clouddisk/office/model/OfficeConfigDTO.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
package com.jmal.clouddisk.office.model; | ||
|
||
import cn.hutool.core.util.StrUtil; | ||
import cn.hutool.crypto.symmetric.SymmetricAlgorithm; | ||
import cn.hutool.crypto.symmetric.SymmetricCrypto; | ||
import com.jmal.clouddisk.office.OfficeConfigService; | ||
import io.swagger.v3.oas.annotations.media.Schema; | ||
import jakarta.validation.Valid; | ||
import jakarta.validation.constraints.Pattern; | ||
import lombok.Data; | ||
|
||
import java.util.List; | ||
|
||
@Data | ||
@Valid | ||
public class OfficeConfigDTO { | ||
|
||
@Pattern( | ||
regexp = "^(https?://)([\\w.-]+)(:[0-9]+)?(/.*)?$|^$", | ||
message = "文档服务器地址格式不正确" | ||
) | ||
@Schema(name = "documentServer", title = "文档服务器地址", example = "http://localhost:8082/office/word") | ||
private String documentServer; | ||
|
||
@Schema(name = "secret", title = "密钥") | ||
private String secret; | ||
|
||
@Pattern( | ||
regexp = "^(https?://)([\\w.-]+)(:[0-9]+)?(/.*)?$|^$", | ||
message = "回调服务地址格式不正确" | ||
) | ||
@Schema(name = "callbackServer", title = "回调服务地址") | ||
private String callbackServer; | ||
|
||
@Schema(name = "tokenEnabled", title = "是否启用token", hidden = true) | ||
public boolean tokenEnabled; | ||
|
||
@Schema(name = "format", title = "默认关联的文件格式") | ||
private List<String> format; | ||
|
||
public OfficeConfigDO toOfficeConfigDO() { | ||
OfficeConfigDO officeConfigDO = new OfficeConfigDO(); | ||
officeConfigDO.setDocumentServer(this.documentServer); | ||
officeConfigDO.setCallbackServer(this.callbackServer); | ||
officeConfigDO.setFormat(this.format); | ||
boolean tokenEnabled = StrUtil.isNotBlank(this.secret); | ||
officeConfigDO.setTokenEnabled(tokenEnabled); | ||
if (OfficeConfigService.VO_KEY.equals(this.secret)) { | ||
return officeConfigDO; | ||
} | ||
if (tokenEnabled) { | ||
String key = OfficeConfigService.generateKey(); | ||
String encrypted = new SymmetricCrypto(SymmetricAlgorithm.AES, key.getBytes()).encryptHex(this.secret); | ||
officeConfigDO.setKey(key); | ||
officeConfigDO.setEncrypted(encrypted); | ||
} else { | ||
officeConfigDO.setKey(null); | ||
officeConfigDO.setEncrypted(null); | ||
} | ||
return officeConfigDO; | ||
} | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters