1.5. 定义用户实体
通过在 用户 实体中添加以下注解来指定存储在模型中的安全信息:
src/main/java/org/acme/security/jpa/User.java
package org.acme.security.jpa;
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
import io.quarkus.hibernate.orm.panache.PanacheEntity;
import io.quarkus.elytron.security.common.BcryptUtil;
import io.quarkus.security.jpa.Password;
import io.quarkus.security.jpa.Roles;
import io.quarkus.security.jpa.UserDefinition;
import io.quarkus.security.jpa.Username;
@Entity
@Table(name = "test_user")
@UserDefinition
public class User extends PanacheEntity {
@Username
public String username;
@Password
public String password;
@Roles
public String role;
/**
* Adds a new user to the database
* @param username the username
* @param password the unencrypted password (it is encrypted with bcrypt)
* @param role the comma-separated roles
*/
public static void add(String username, String password, String role) {
User user = new User();
user.username = username;
user.password = BcryptUtil.bcryptHash(password);
user.role = role;
user.persist();
}
}
只有在单个实体被标上 @UserDefinition 标注时,quarkus-security-jpa 扩展才会初始化。
- 1
@UserDefinition注释必须存在于单个实体上,可以是常规的 Hibernate ORM 实体,也可以是带有 Panache 实体的 Hibernate ORM。- 2
- 表示用于用户名的字段。
- 3
- 指明用于密码的字段。默认情况下,它使用 bcrypt-hashed 密码。您可以将其配置为使用纯文本或自定义密码。
- 4
- 表示添加到目标主体表示属性中的以逗号分隔的角色列表。
- 5
- 提供了一种帮助程序方法来添加正确哈希密码的用户。
BcryptUtil.bcryptHash ()方法:- 为每个密码自动生成随机 salt。
- 使用带有 10 个迭代(默认)的 bcrypt 对密码进行哈希处理。
- 返回 Modular Crypt Format (MCF)中的哈希,其中包括算法标识符、成本参数、salt 和 hash。
提示
密码散列最佳实践:
-
始终将纯文本密码传递给
BcryptUtil.bcryptHash ()- 永远不会预哈希它们。 - bcrypt 哈希包含 salt,因此不需要单独的 salt 存储。
-
要在身份验证过程中验证密码,框架会自动使用
BcryptUtil.matches (plainPassword, hashedPassword)。 -
对于自定义迭代:
BcryptUtil.bcryptHash (password, iterationCount)在更高的迭代(12-14))提供更多安全性,但性能较慢。
- 有关配置密码和角色的更多信息 ,请参阅配置应用程序。
- 有关哈希密码和可用选项的更多信息,请参阅 密码存储和散列。
注意
记得设置 Panache 和 PostgreSQL JDBC 驱动程序。如需更多信息,请参阅使用 Panache 设置和配置 Hibernate ORM。