我目前正在嘗試使用 Java Spring Boot Framework 學習后端開發。對于 POC,我正在構建安全令牌服務 (STS) 服務器,其作用是為有效的用戶身份驗證請求生成 JWT 令牌。
我遇到了一個問題,我試圖使用@Value注釋從application.yml檔案中獲取JWT 密鑰。由于代碼中的硬編碼秘密被認為是不好的做法。所以我想使用 @Value 注釋從 application.yml 檔案中注入這個秘密,然后使用這個秘密密鑰對令牌進行簽名,但我在這里得到 NULL VALUE EXCEPTION。下面是我正在嘗試做的代碼片段
@Slf4j
@Data
@Component
public class JwtUtil {
@Value("${JWT.secret: JWT_SECRET_KEY}")
public String jwtSecret;
private Integer expiryTimeInMinutes = 100000;
private Algorithm tokenSigningAlgo = Algorithm.HMAC256(jwtSecret);
public String generateJWT(String subject, Map<String, Object> claims) {
return JWT
.create()
.withSubject(subject)
.withPayload(claims)
.withExpiresAt(new Date(System.currentTimeMillis() expiryTimeInMinutes * 60 * 1000))
.sign(tokenSigningAlgo);
}
}
這是我得到的例外
Constructor threw exception; nested exception is java.lang.IllegalArgumentException: The Secret cannot be null
我已將此JWT.secret值存盤在 application.yml 中。
JWT:
secret: "SECRET_KEY"
expiryTimeInMinutes: 20
從我的除錯中我知道@Value 注解在創建類 JwtUtil 的 bean 之后初始化 secret 的值。因為我在洗掉 JWT 創建邏輯(拋出空值例外)后嘗試記錄 secret 的值,然后它作業正常。我從 application.yml 獲得預期值。
有什么方法可以在創建 JwtUtil bean 之前獲取 @Value 注釋值?或者你們可以建議我實作這一目標的最佳實踐。
提前致謝!
uj5u.com熱心網友回復:
在呼叫目標類的建構式之后創建 bean。類的建構式JwtUtil被呼叫,然后被呼叫這部分private Algorithm tokenSigningAlgo = Algorithm.HMAC256(jwtSecret);
BeanJwtUtil還沒有被創建。其中一種方法用注解替換Algorithm.HMAC256(jwtSecret)為 init 方法PostCostruct
uj5u.com熱心網友回復:
試試@ConfigurationProperties
@Component
@Getter
@Setter
@ConfigurationProperties(prefix = "oauth2", ignoreUnknownFields = false)
public class OauthProperties {
private String jwtSecret;
private Long jwtExpirationInMs;
}
應用程式.yml
oauth2:
jwtSecret: SecretKey
jwtExpirationInMs: 86400000
在此處注入您的配置類
@Component
@AllArgsConstructor
public class JwtTokenProvider {
private final Logger logger = LoggerFactory.getLogger(JwtTokenProvider.class);
private OauthProperties oauthProperties;
...
uj5u.com熱心網友回復:
您面臨的問題可以通過添加建構式來解決,例如
@Slf4j
@Data
@Component
public class JwtUtil {
private static finalInteger expiryTimeInMinutes = 100000;
private Algorithm tokenSigningAlgo;
JwtUtil(@Value("${JWT.secret: JWT_SECRET_KEY}") String jwtSecret) {
tokenSigningAlgo = Algorithm.HMAC256(jwtSecret);
};
public String generateJWT(String subject, Map<String, Object> claims){
return JWT
.create()
.withSubject(subject)
.withPayload(claims)
.withExpiresAt(new Date(System.currentTimeMillis() expiryTimeInMinutes * 60 * 1000))
.sign(tokenSigningAlgo);
}
}
這會稍微改變實體化流程,因為它將確保在執行方法jwtSecret之前已為建構式引數分配了正確的值Algorithm.HMAC256(jwtSecret)。
uj5u.com熱心網友回復:
一個好的做法是String jwtSecret在建構式中注入以便于測驗,例如:
public JwtUtil(@Value("${JWT.secret}") String jwtSecret) {
this.tokenSigningAlgo = Algorithm.HMAC256(jwtSecret);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/429137.html
上一篇:springboot:方法addProduct的引數0需要一個找不到的“java.lang.String”型別的bean
