JDBC领域表单身份验证登录失败

时间:2015-04-04 12:41:58

标签: java-ee glassfish-4 jdbcrealm

我尝试创建JDBC领域和表单基本身份验证,我能够成功地遵循JavaEE教程中的说明,但我总是收到登录失败的消息。

有人能指出我正确的方向吗?我知道我只是错过了教程中的内容。

我已经在域/域1 / lib

中粘贴了mysql的.jar

服务器

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();
        }
    }
}

编辑:(其他信息) 密码字段数据类型是blob,现在它的值为NULL,仅用于测试目的。 :)

修改 将摘要算法更改为SHA-256。我将密码字段数据类型更改为varchar,但仍然收到登录失败消息。


更新 我用加密密码更新了密码字段。

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();
            }
        }
}

我尝试传递加密和非加密密码但输出相同,登录失败。

谢谢, 钟

2 个答案:

答案 0 :(得分: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

谢谢, 钟

答案 1 :(得分:0)

我遇到了类似的问题,我只能通过从Base64-Encoding切换到Hex-Encoding来解决。很可能Glassfish中的Base64计算被破坏了。