java 如何在Sping Boot 中获取阅读JWT的密钥

0sgqnhkj  于 2023-11-15  发布在  Java
关注(0)|答案(1)|浏览(170)

我在做一个简单的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);

deikduxw

deikduxw1#

您可以将您的秘密存储在.env文件中,并在application.properties中放置占位符。
1.将.env文件放在项目根目录下。
1.增加行SECRET_KEY=somekey
1.调整application.properties以包含以下属性:

spring.config.import=optional:file:.env[.properties]
jwtKey=${SECRET_KEY}

字符串
1.通过“@Value(”${jwtKey}“)获取应用程序中的密钥
在此之后,Spring将从application.properties中获取您的密钥,并向下转到.env文件。
.env文件仅存储在您的计算机上,请勿在Internet上共享。
此外,通过这种方法,任何开发人员都可以提供自己的密钥并运行您的应用程序。

建议:

  • 将尽可能多的属性移动到.env文件中。这将使您的应用更可配置,而无需重新构建(例如使用Docker时)

相关问题