Я попытался создать базовую аутентификацию JDBC и базовую аутентификацию, я смог успешно выполнить инструкции в учебнике JavaEE, но всегда получаю сообщение об ошибке входа в систему.Ошибка аутентификации формы JDBC в домене
Может ли кто-нибудь указать мне в правильном направлении? Я знаю, что я просто что-то пропустил в учебнике.
Я уже вставить .jar в MySQL в домене/domain1/Lib
Realm:
Realm Name: my_realm
Class Name:
com.sun.enterprise.security.ee.auth.realm.jdbc.JDBCRealm
JAAS Context: jdbcRealm
JNDI: my_jndi
User Table: sample_db.app_users
User Name Column: username
Password Column: password
Group Table: sample_db.roles
Group Name Column: role_name
Password Encryption Algorithm: 1234
Digest Algorithm: SHA-512 // **EDIT: this is SHA-256**
Encoding: Base64
web.xml
<security-constraint>
<display-name>protected-pages</display-name>
<web-resource-collection>
<web-resource-name>protected-pages</web-resource-name>
<url-pattern>/faces/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>authenticatedUser</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<realm-name>my_realm</realm-name>
<form-login-config>
<form-login-page>/index.xhtml</form-login-page>
<form-error-page>/index.xhtml</form-error-page>
</form-login-config>
</login-config>
<security-role>
<role-name>authenticatedUser</role-name>
</security-role>
GlassFish-web.xml
<security-role-mapping>
<role-name>authenticatedUser</role-name>
<group-name>authenticatedUser</group-name>
</security-role-mapping>
LoginController.java
@ManagedBean
@RequestScoped
public class LoginController implements Serializable {
public void login() {
try {
FacesContext fc = FacesContext.getCurrentInstance();
HttpServletRequest request = (HttpServletRequest) fc.getExternalContext().getRequest();
request.login(this.getUsername(), null);
// redirect to home page
fc.getExternalContext().redirect("faces/home.xhtml");
} catch(ServletException ex) {
ex.printStackTrace();
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
Edit: (Дополнительная информация) Тип данных поле пароль блоб и сейчас его значение равно NULL, только для тестирования определил. :)
Edit: Change Digest Алгоритм SHA-256
. Я меняю тип данных поля пароля на varchar, но все же я получаю сообщение с ошибкой входа.
Update: Я обновил поле пароля с зашифрованным паролем.
import com.sun.org.apache.xml.internal.security.utils.Base64;
MessageDigest md = java.security.MessageDigest.getInstance("SHA-256");
md.update(password.getBytes("UTF-8"));
byte[] passwordDigest = md.digest();
System.out.println(Base64.encode(passwordDigest));
Вот обновленный метод Войти
public void login() {
try {
FacesContext fc = FacesContext.getCurrentInstance();
HttpServletRequest request = (HttpServletRequest) fc.getExternalContext().getRequest();
request.login(this.getUsername(), this.getPassword());
// redirect to home page
fc.getExternalContext().redirect("faces/home.xhtml");
} catch(ServletException ex) {
ex.printStackTrace();
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
Я попытался передать зашифровано и не зашифрованный пароль, но тот же результат, Войти не удалось.
Спасибо, Bell
Почему вы пытаетесь войти в систему с паролем 'null' -' request.login (this.getUsername(), null); '?Кроме того, поскольку вы устанавливаете «Алгоритм дайджеста» на «SHA-512», вам нужно будет хранить список паролей в базе данных в соответствии с этим типом шифрования (вам не нужен тип данных BLOB для хранения паролей). – Tiny
Здравствуйте, крошечный, спасибо за ваш ответ, я установил нулевой пароль в request.login, потому что значение поля user_password также было нулевым. С алгоритмом дайджеста это было ошибкой, это был SHA-256 – bell
Я не думаю, что вам разрешено оставить поле пароля пустым. Я никогда не пробовал с «пустым» паролем просто потому, что он не нужен. – Tiny