我尝试创建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();
}
}
}
我尝试传递加密和非加密密码但输出相同,登录失败。
谢谢, 钟
答案 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计算被破坏了。