我试图在Windows上本地运行Netbeans / Glassfish应用程序,该应用程序当前正在Unix服务器上运行。我已成功启动并运行应用程序,但由于授权异常,无法通过登录显示。我在应用程序的数据库中设置了我的姓名(电子邮件)和密码,并且能够使用我的凭据登录到Unix服务器上运行的应用程序。我已经通过putty隧道将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>
&#34; mycompany-security-realm&#34;包含在名为&#34; domain.xml&#34;
的生成文件中 <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中注释auth-realm,但也没有运气。
答案 0 :(得分:0)
消息
LoginException: Failed file login for myname@mycompnay.com
表示(“文件登录失败”)您的应用程序未使用您想要使用的JDBC域但是默认文件域。
这种情况的常见原因是,在JDBCfish中确实没有配置JDBC领域,或者在错误的配置中配置了JDBC领域。 default-config
中有server-config
部分和domain.xml
部分。确保在server-config
。
要停用身份验证,只需注释掉security-constraint
和login-config
。