我正在尝试在Windows上本地运行Netbeans/Glassfish应用程序,该应用程序目前正在Unix服务器上运行。我已经成功地启动并运行了应用程序,但由于授权异常而无法通过登录显示。我在应用程序的数据库中设置了我的姓名(电子邮件)和密码,并且能够使用我的凭据登录到在Unix服务器上运行的应用程序。我已经通过腻子隧道将 Glassfish 服务器连接到数据库,并通过 Glassfish 管理控制台成功 ping 它。 我还修改了 sun-resources.xml 以使用隧道端口进行数据库访问。
程序执行身份验证的方式是使用以下代码:
boolean authenticateSucceeded=false;
try {
ProgrammaticLogin pl=new ProgrammaticLogin();
authenticateSucceeded=pl.login(user, getEncryptedPassword(password), "mycompany-security-realm", request, response, true);
String LOGIN_MSG="Login ok for user: "+user;
logger.info(LOGIN_MSG);
}
catch (javax.security.auth.login.LoginException e) {
logger.info("Login exception, user: "+user+", message ="+e.getMessage());
e.printStackTrace();
}
catch (Exception e) {
logger.info("Login exception, user: "+user+", message ="+e.getMessage());
e.printStackTrace();
}
String forward=null;
if (authenticateSucceeded)
{
forward=URL_HOME_PAGE;
}
else{
forward=LOGIN_ERROR_PAGE;
String loginComment="Login failed: user ="+user+", fwd ="+forward;
logger.info(loginComment);
}
forward(request,response,forward);
下面是部分堆栈转储:
SEVERE: com.sun.enterprise.security.auth.login.common.LoginException: Login failed: javax.security.auth.login.LoginException: Failed file login for myname@mycompnay.com.
at com.sun.enterprise.security.auth.login.LoginContextDriver.doPasswordLogin(LoginContextDriver.java:353)
at com.sun.enterprise.security.auth.login.LoginContextDriver.login(LoginContextDriver.java:199)
at com.sun.enterprise.security.auth.login.LoginContextDriver.login(LoginContextDriver.java:152)
at com.sun.web.security.WebProgrammaticLoginImpl.login(WebProgrammaticLoginImpl.java:122)
at com.sun.appserv.security.ProgrammaticLogin$2.run(ProgrammaticLogin.java:259)
at java.security.AccessController.doPrivileged(Native Method)
以下是为登录安全性配置的 Web.xml:
<security-constraint>
<web-resource-collection>
<web-resource-name>MySecureResource</web-resource-name>
<url-pattern>/stage/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>*</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<realm-name>mycompany-security-realm</realm-name>
<form-login-config>
<form-login-page>/login/login.jsp</form-login-page>
<form-error-page>/login/forgotPassword.jsp</form-error-page>
</form-login-config>
</login-config>
"mycompany-security-realm"包含在一个名为"domain.xml的生成文件中
<auth-realm classname="com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm" name="mycompany-security-realm">
<property name="jaas-context" value="jdbcRealm"/>
<property name="password-column" value="password"/>
<property name="group-table" value="grouptable"/>
<property name="datasource-jndi" value="jdbc/mycompany-sec"/>
<property name="user-table" value="usertable"/>
<property name="group-name-column" value="groupid"/>
<property name="jass-context" value="jdbcRealm"/>
<property name="db-password" value="xxxx"/>
<property name="digest-algorithm" value="none"/>
<property name="db-user" value="mycompanydbuser"/>
<property name="user-name-column" value="userid"/>
</auth-realm>
当我查看 domain.xml 中指定的 jdbc 时,它与生产版本不同,后者在服务器上设置为指向不同的数据库。但是,当我将其设置为指向同一数据库时,我得到相同的异常。
这是一个遗留应用程序,在最坏的情况下,我可以将其加载到测试服务器并在那里进行测试。但是,为了形式起见,我想在本地运行它。我怎样才能让这个东西工作?还是禁用身份验证更好,如果是,如何禁用?我确实尝试在 web.xml 中注释掉身份验证领域,但也没有运气。
消息
LoginException: Failed file login for myname@mycompnay.com
指示("文件登录失败")您的应用程序未使用要使用的 JDBC 域,而是使用缺省文件域。
造成这种情况的常见原因是 JDBC 领域实际上没有在 Glassfish 中配置,或者它在错误的配置中配置。domain.xml
中有一个default-config
部分和一个server-config
部分。确保在 server-config
中配置 JDBC 领域。
要禁用身份验证,只需注释掉security-constraint
和login-config
即可。