2015-04-04 3 views
0

Я попытался создать базовую аутентификацию 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

+0

Почему вы пытаетесь войти в систему с паролем 'null' -' request.login (this.getUsername(), null); '?Кроме того, поскольку вы устанавливаете «Алгоритм дайджеста» на «SHA-512», вам нужно будет хранить список паролей в базе данных в соответствии с этим типом шифрования (вам не нужен тип данных BLOB для хранения паролей). – Tiny

+0

Здравствуйте, крошечный, спасибо за ваш ответ, я установил нулевой пароль в request.login, потому что значение поля user_password также было нулевым. С алгоритмом дайджеста это было ошибкой, это был SHA-256 – bell

+0

Я не думаю, что вам разрешено оставить поле пароля пустым. Я никогда не пробовал с «пустым» паролем просто потому, что он не нужен. – Tiny

ответ

0

После большого количества изменений в jdbcRealm я узнал, что я не удалил файл-сферу, что я создал. Я думаю, что он смотрел на file-realm, хотя я указал my_realm в web.xml.

Вот последние настройки области.

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: SHA-256 
Digest Algorithm: SHA-256 
Encoding: Base64 
Char: UTF-8 

Спасибо, Bell

0

я столкнулся с подобными проблемами, которые я мог бы решить только за счет перехода от Base64-кодирования в Hex-Encoding. Скорее всего, Base64-вычисление в Glassfish нарушено.

Смежные вопросы