【发布时间】:2012-10-02 15:42:54
【问题描述】:
我正在尝试为 Glassfish V3.1.1 创建自定义领域,但是当我使用 BASIC 方法登录时出现了一些 LoginException:
[#|2012-10-11T22:57:21.625+0200|FINE|glassfish3.1.2|org.apache.catalina.authenticator.AuthenticatorBase|_ThreadID=35;_ThreadName=Thread-2;ClassName=org.apache。 catalina.authenticator.AuthenticatorBase;MethodName=invoke;|安全检查请求 GET /testForMySimRealm/S1|#]
[#|2012-10-11T22:57:21.625+0200|FINE|glassfish3.1.2|org.apache.catalina.authenticator.AuthenticatorBase|_ThreadID=35;_ThreadName=Thread-2;ClassName=org.apache。 catalina.authenticator.AuthenticatorBase;方法名=调用;| 调用 hasUserDataPermission()|#]
[#|2012-10-11T22:57:21.625+0200|FINE|glassfish3.1.2|javax.enterprise.system.container.web.com.sun.web.security|_ThreadID=35;_ThreadName=Thread- 2;ClassName=com.sun.web.security.RealmAdapter;MethodName=hasUserDataPermission;|[Web-Security][ hasUserDataPermission ] 主体:空 ContextPath: /testForMySimRealm|#]
[#|2012-10-11T22:57:21.625+0200|FINE|glassfish3.1.2|javax.enterprise.system.container.web.com.sun.web.security|_ThreadID=35;_ThreadName=Thread- 2;ClassName=com.sun.web.security.RealmAdapter;MethodName=invokeWebSecurityManager;|[Web-Security] [ hasResourcePermission ] 主体:空 ContextPath: /testForMySimRealm|#]
[#|2012-10-11T22:57:21.625+0200|FINE|glassfish3.1.2|org.apache.catalina.authenticator.AuthenticatorBase|_ThreadID=35;_ThreadName=Thread-2;ClassName=org.apache。 catalina.authenticator.AuthenticatorBase;方法名=调用;| 调用 authenticate()|#]
[#|2012-10-11T22:57:21.640+0200|FINE|glassfish3.1.2|org.apache.catalina.authenticator.AuthenticatorBase|_ThreadID=35;_ThreadName=Thread-2;ClassName=org.apache。 catalina.authenticator.AuthenticatorBase;方法名=调用;| 验证失败()测试|#]
[#|2012-10-11T22:57:21.640+0200|FINE|glassfish3.1.2|org.apache.catalina.connector.OutputBuffer|_ThreadID=35;_ThreadName=Thread-2;ClassName=org.apache。 catalina.connector.OutputBuffer;MethodName=setConverter;|得到 编码:ISO-8859-1|#]
[#|2012-10-11T22:57:21.640+0200|FINE|glassfish3.1.2|org.apache.catalina.connector.OutputBuffer|_ThreadID=35;_ThreadName=Thread-2;ClassName=org.apache。 catalina.connector.OutputBuffer;MethodName=realWriteBytes;|realWrite(b, 0, 1073) com.sun.grizzly.tcp.Response@192d307|#]
[#|2012-10-11T22:57:21.640+0200|FINEST|glassfish3.1.2|org.apache.catalina.connector.InputBuffer|_ThreadID=35;_ThreadName=Thread-2;ClassName=org.apache。 catalina.connector.InputBuffer;MethodName=recycle;|recycle()|#]
[#|2012-10-11T22:57:21.640+0200|FINE|glassfish3.1.2|org.apache.catalina.connector.OutputBuffer|_ThreadID=35;_ThreadName=Thread-2;ClassName=org.apache。 catalina.connector.OutputBuffer;MethodName=recycle;|recycle()|#]
[#|2012-10-11T22:57:24.625+0200|FINE|glassfish3.1.2|org.apache.catalina.authenticator.AuthenticatorBase|_ThreadID=36;_ThreadName=Thread-2;ClassName=org.apache。 catalina.authenticator.AuthenticatorBase;MethodName=invoke;|安全 检查请求 GET /testForMySimRealm/S1|#]
[#|2012-10-11T22:57:24.625+0200|FINE|glassfish3.1.2|org.apache.catalina.authenticator.AuthenticatorBase|_ThreadID=36;_ThreadName=Thread-2;ClassName=org.apache。 catalina.authenticator.AuthenticatorBase;方法名=调用;| 调用 hasUserDataPermission()|#]
[#|2012-10-11T22:57:24.625+0200|FINE|glassfish3.1.2|javax.enterprise.system.container.web.com.sun.web.security|_ThreadID=36;_ThreadName=Thread- 2;ClassName=com.sun.web.security.RealmAdapter;MethodName=hasUserDataPermission;|[Web-Security][ hasUserDataPermission ] 主体:空 ContextPath: /testForMySimRealm|#]
[#|2012-10-11T22:57:24.625+0200|FINE|glassfish3.1.2|javax.enterprise.system.container.web.com.sun.web.security|_ThreadID=36;_ThreadName=Thread- 2;ClassName=com.sun.web.security.RealmAdapter;MethodName=invokeWebSecurityManager;|[Web-Security] [ hasResourcePermission ] 主体:空 ContextPath: /testForMySimRealm|#]
[#|2012-10-11T22:57:24.625+0200|FINE|glassfish3.1.2|org.apache.catalina.authenticator.AuthenticatorBase|_ThreadID=36;_ThreadName=Thread-2;ClassName=org.apache。 catalina.authenticator.AuthenticatorBase;方法名=调用;| 调用 authenticate()|#]
[#|2012-10-11T22:57:24.625+0200|FINE|glassfish3.1.2|javax.enterprise.system.container.web.com.sun.web.security|_ThreadID=36;_ThreadName=Thread- 2;ClassName=com.sun.web.security.RealmAdapter;MethodName=authenticate;|Tomcat 验证用户/密码的回调|#]
[#|2012-10-11T22:57:24.625+0200|FINE|glassfish3.1.2|javax.enterprise.system.container.web.com.sun.web.security|_ThreadID=36;_ThreadName=Thread- 2;ClassName=com.sun.web.security.RealmAdapter;MethodName=authenticate;|usename = j|#]
[#|2012-10-11T22:57:24.625+0200|警告|glassfish3.1.2|javax.enterprise.system.container.web.com.sun.web.security|_ThreadID=36;_ThreadName=Thread- 2;|WEB9102: 网页登录失败: com.sun.enterprise.security.auth.login.common.LoginException:登录 失败:Entrée NULL 无效:nom|#]
[#|2012-10-11T22:57:24.625+0200|FINE|glassfish3.1.2|javax.enterprise.system.container.web.com.sun.web.security|_ThreadID=36;_ThreadName=Thread- 2;ClassName=com.sun.web.security.RealmAdapter;MethodName=authenticate;|异常 com.sun.enterprise.security.auth.login.common.LoginException:登录 失败:Entrée NULL 无效:标称 com.sun.enterprise.security.auth.login.LoginContextDriver.doPasswordLogin(LoginContextDriver.java:394) 在 com.sun.enterprise.security.auth.login.LoginContextDriver.login(LoginContextDriver.java:240) 在 com.sun.enterprise.security.auth.login.LoginContextDriver.login(LoginContextDriver.java:153) 在 com.sun.web.security.RealmAdapter.authenticate(RealmAdapter.java:514) 在 com.sun.web.security.RealmAdapter.authenticate(RealmAdapter.java:455) 在 org.apache.catalina.authenticator.BasicAuthenticator.authenticate(BasicAuthenticator.java:169) 在 com.sun.web.security.RealmAdapter.invokeAuthenticateDelegate(RealmAdapter.java:1333) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:551) 在 org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:623) 在 org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161) 在 org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231) 在 com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317) 在 com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195) 在 com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860) 在 com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757) 在 com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056) 在 com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229) 在 com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) 在 com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) 在 com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) 在 com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) 在 com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) 在 com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) 在 com.sun.grizzly.ContextTask.run(ContextTask.java:71) 在 com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) 在 com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) 在 java.lang.Thread.run(Thread.java:722) 引起: javax.security.auth.login.LoginException: Entrée NULL 无效: nom 在 javax.security.auth.login.LoginContext.init(LoginContext.java:246) 在 javax.security.auth.login.LoginContext.(LoginContext.java:382) 在 javax.security.auth.login.LoginContext.(LoginContext.java:459) 在 com.sun.enterprise.security.auth.login.LoginContextDriver.doPasswordLogin(LoginContextDriver.java:381) ... 还有 28 个 |#]
[#|2012-10-11T22:57:24.625+0200|FINE|glassfish3.1.2|org.apache.catalina.authenticator.AuthenticatorBase|_ThreadID=36;_ThreadName=Thread-2;ClassName=org.apache。 catalina.authenticator.AuthenticatorBase;方法名=调用;| 验证失败()测试|#]
[#|2012-10-11T22:57:24.625+0200|FINE|glassfish3.1.2|org.apache.catalina.connector.OutputBuffer|_ThreadID=36;_ThreadName=Thread-2;ClassName=org.apache。 catalina.connector.OutputBuffer;MethodName=setConverter;|得到 编码:ISO-8859-1|#]
[#|2012-10-11T22:57:24.625+0200|FINE|glassfish3.1.2|org.apache.catalina.connector.OutputBuffer|_ThreadID=36;_ThreadName=Thread-2;ClassName=org.apache。 catalina.connector.OutputBuffer;MethodName=realWriteBytes;|realWrite(b, 0, 1073) com.sun.grizzly.tcp.Response@7e592c|#]
[#|2012-10-11T22:57:24.625+0200|FINEST|glassfish3.1.2|org.apache.catalina.connector.InputBuffer|_ThreadID=36;_ThreadName=Thread-2;ClassName=org.apache。 catalina.connector.InputBuffer;MethodName=recycle;|recycle()|#]
[#|2012-10-11T22:57:24.625+0200|FINE|glassfish3.1.2|org.apache.catalina.connector.OutputBuffer|_ThreadID=36;_ThreadName=Thread-2;ClassName=org.apache。 catalina.connector.OutputBuffer;MethodName=recycle;|recycle()|#]
这是我的领域类:
CustomSimLoginModule 扩展 AppservPasswordLoginModule :
package com.sim;
import javax.security.auth.login.LoginException;
import com.sun.appserv.security.AppservPasswordLoginModule;
public class CustomSimLoginModule extends AppservPasswordLoginModule {
@Override
protected void authenticateUser() throws LoginException {
// TODO Auto-generated method stub
System.out.println("AUTHENTIFICATION !!");
String[] grpList = {"ADMIN"};
commitUserAuthentication(grpList);
}
}
CustomSimRealm 扩展 AppservRealm:
package com.sim;
import java.util.Enumeration;
import java.util.Properties;
import java.util.Vector;
import com.sun.appserv.security.AppservRealm;
import com.sun.enterprise.security.auth.realm.BadRealmException;
import com.sun.enterprise.security.auth.realm.InvalidOperationException;
import com.sun.enterprise.security.auth.realm.NoSuchRealmException;
import com.sun.enterprise.security.auth.realm.NoSuchUserException;
public class CustomSimRealm extends AppservRealm {
@Override
public void init(Properties properties) throws BadRealmException, NoSuchRealmException {
System.out.println("CustomSimRealm->init");
Enumeration<?> names = properties.propertyNames();
String name = null;
while(names.hasMoreElements()){
name = (String)names.nextElement();
System.out.println("name->" + name + " value->" + properties.getProperty(name));
}
}
@Override
public String getAuthType() {
return "BASIC";
}
@Override
public Enumeration<String> getGroupNames(String username)
throws InvalidOperationException, NoSuchUserException {
Vector<String> v = new Vector<String>();
v.add("ADMIN");
return v.elements();
}
}
这两个类被打包成 maven 的 JAR 文件,并具有以下依赖关系:
<dependency>
<groupId>org.glassfish.main.security</groupId>
<artifactId>security</artifactId>
<version>3.1.2</version>
</dependency>
JAR 文件被复制到 ${GLASSFISH}/glassfish/domains/domain1/lib 目录中,我将 login.conf 更改为:
simRealm {
com.sim.CustomSimLoginModule required;
};
和 domain.xml 与:
<auth-realm name="sim-realm" classname="com.sim.CustomSimRealm">
<property name="prop1" value="test propriete 1"></property>
<property name="prop2" value="test propriete 2"></property>
<property description="null" name="jaas-context" value="simRealm"></property>
</auth-realm>
Glassfish 启动时未引发异常,但用户输入凭据时会引发上述异常。
请问我做错了什么?
PS:没有使用 Glassfish create-auth-realm 命令,我手动更改了 login.conf 和 domain.xml,这可能是问题?
感谢您的意见
奥利维尔
【问题讨论】:
标签: glassfish-3 realm