Я пытаюсь использовать API безопасности в Java EE 8 , хэшируя пароль.Я создал @ DatabaseIdentityStoreDefinition
@BasicAuthenticationMechanismDefinition(
realmName = "Book Realm"
)
@DatabaseIdentityStoreDefinition(
dataSourceLookup = "jdbc/userAuth",
callerQuery = "select password from users where USERNAME = ?",
groupsQuery = "select g.GROUP_NAME from USER_GROUPS ug, users u, GROUPS g where ug.USER_ID = u.user_id and g.GROUP_ID= ug.GROUP_ID and u.USERNAME=?"
hashAlgorithm = Pbkdf2PasswordHash.class,
hashAlgorithmParameters = {
"Pbkdf2PasswordHash.Iterations=3072",
"Pbkdf2PasswordHash.Algorithm=PBKDF2WithHmacSHA512",
"Pbkdf2PasswordHash.SaltSizeBytes=64"
}
)
@DeclareRoles({"user", "admin"})
@WebServlet("/securedServlet")
@ServletSecurity(
@HttpConstraint(rolesAllowed = {"admin"}))
public class SecuredServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("Congratulations, login successful.");
}
}
при развертывании файла war на сервере приложений Glassfish 5 я получаю следующее исключение:
java.lang.IllegalStateException: java.security.NoSuchAlgorithmException: PBKDF2WithHmacSHA512 SecretKeyFactory not available
Это исключение приходитиз класса, который я создал для автоматического создания и вставки пользователя в базу данных.
Соответствующие части этого класса:
@Resource(mappedName = "jdbc/userAuth")
private DataSource dataSource;
@Inject
private Pbkdf2PasswordHash passwordHash;
public void init(@Observes @Initialized(ApplicationScoped.class) Object init) {
Map<String, String> parameters = new HashMap<>();
parameters.put("Pbkdf2PasswordHash.Iterations", "3072");
parameters.put("Pbkdf2PasswordHash.Algorithm", "PBKDF2WithHmacSHA512");
parameters.put("Pbkdf2PasswordHash.SaltSizeBytes", "64");
passwordHash.initialize(parameters);
executeUpdate(dataSource, "INSERT INTO USERS (USER_ID,USERNAME,FIRST_NAME,MIDDLE_NAME,LAST_NAME,PASSWORD) VALUES (1,'beaver','Beaver','The Dam','Lake','" + passwordHash.generate("beaverattack".toCharArray()) + "')");
В файле pom.xml у меня есть следующеезависимости:
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>8.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.security.enterprise</groupId>
<artifactId>javax.security.enterprise-api</artifactId>
<version>1.0</version>
<scope>provided</scope>
</dependency>
Java-версия:
java version "1.8.0_211"
Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)