我在做一个简单的Spring Boot 应用程序,我已经做了登录方法,它创建了用密钥签名的JWT。每次在SecurityConfig类中运行应用程序时,都会自动生成密钥。现在我想做的是从任何请求中获取令牌并验证用户的角色。(我使用一个简单的枚举实现了3种不同类型的用户),以查看该角色是否被授权执行请求。application.properties并使用@Value注解访问它,但是因为密钥是自动生成的,我不能将其保存在application.properties中。我知道将其存储在application.properties中不安全,但这只是我为了提高知识而做的一个项目,并不是真的想在这里变得超级安全。关于如何注入/获取密钥以阅读任何jwt的提示?
下面是在SecurityConfig类中创建密钥的方法
@Bean
public SecretKey secretKey() {
SecretKey secretKey = Keys.secretKeyFor(SignatureAlgorithm.HS256);
byte[] encodedKey = secretKey.getEncoded();
String encodedKeyBase64 = Base64.getEncoder().encodeToString(encodedKey);
System.out.println("Secret Key (Base64): " + encodedKeyBase64);
return secretKey;
}
字符串
然后为JwtAuthFilter的构造函数传递
@Bean
public JwtAuthFilter jwtAuth() {
return new JwtAuthFilter(secretKey());
}
型
下面是我计划在控制器中阅读JWT来创建建筑物的内容(edificio = building its just in spanish)
@RestController
@RequestMapping(path ="tpo_apis/edificios")
public class EdificioController {
@Autowired
private EdificioService edificioService;
@Value("${jwt.secret}")
private SecretKey secret;
@PostMapping(path ="/")
public ResponseEntity<?> createEdificio(@RequestBody EdificioModel edificio, @RequestHeader(name = "Authorization") String token) throws Exception {
Claims claims = Jwts.parser()
.verifyWith(secret) // secret should be the secret key to read the token
.build()
.parseSignedClaims(token.replace("Bearer ", ""))
.getPayload();
System.out.println(claims.getSubject());
return new ResponseEntity<>(edificioService.createEdificio(edificio), HttpStatus.CREATED);
型
这是我如何创建JWT的,尽管我认为这并不重要。
@PostMapping("/login")
public ResponseEntity<String> login(@RequestBody UsuarioModelDTO credentials) {
// Validar las credenciales aquí (puedes usar Spring Security u otros
// mecanismos)
UsuarioModel usuario = this.usuarioService.findUsuario(credentials.getUsuario(), credentials.getPassword());
if (usuario != null) {
// Crear el token JWT
String token = Jwts.builder()
.subject(credentials.getUsuario()).issuedAt(new Date())
.claim("rol", usuario.getTipoUsuario())
.issuedAt(new Date())
.expiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME_IN_MIN * 60 * 1000))
.signWith(secretKey, SignatureAlgorithm.HS256).compact();
return new ResponseEntity<>(token, HttpStatus.OK);
型
1条答案
按热度按时间deikduxw1#
您可以将您的秘密存储在
.env
文件中,并在application.properties
中放置占位符。1.将
.env
文件放在项目根目录下。1.增加行
SECRET_KEY=somekey
1.调整
application.properties
以包含以下属性:字符串
1.通过“@Value(”${jwtKey}“)获取应用程序中的密钥
在此之后,Spring将从
application.properties
中获取您的密钥,并向下转到.env
文件。此
.env
文件仅存储在您的计算机上,请勿在Internet上共享。此外,通过这种方法,任何开发人员都可以提供自己的密钥并运行您的应用程序。
建议:
.env
文件中。这将使您的应用更可配置,而无需重新构建(例如使用Docker时)