2013-05-19 123 views
14

嗯,我正在嘗試爲我的Servlet(在Eclipse中的Tomcat 7上運行)創建JAAS身份驗證,但我收到此錯誤。javax.security.auth.login.LoginException:沒有爲SomeLogin配置LoginModules

He're的完整的堆棧跟蹤: 「`

INFO: Starting Servlet Engine: Apache Tomcat/7.0.32 
Geg 19, 2013 9:53:08 PM org.apache.coyote.AbstractProtocol start 
INFO: Starting ProtocolHandler ["http-bio-8080"] 
Geg 19, 2013 9:53:08 PM org.apache.coyote.AbstractProtocol start 
INFO: Starting ProtocolHandler ["ajp-bio-8009"] 
Geg 19, 2013 9:53:08 PM org.apache.catalina.startup.Catalina start 
INFO: Server startup in 1786 ms 
Geg 19, 2013 9:53:30 PM org.apache.catalina.realm.JAASRealm authenticate 
SEVERE: Unexpected error 
javax.security.auth.login.LoginException: No LoginModules configured for GdiaLogin 
    at javax.security.auth.login.LoginContext.init(Unknown Source) 
    at javax.security.auth.login.LoginContext.<init>(Unknown Source) 
    at org.apache.catalina.realm.JAASRealm.authenticate(JAASRealm.java:392) 
    at org.apache.catalina.realm.JAASRealm.authenticate(JAASRealm.java:332) 
    at org.apache.catalina.authenticator.BasicAuthenticator.authenticate(BasicAuthenticator.java:158) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:544) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 

Geg 19, 2013 10:29:20 PM org.apache.catalina.realm.JAASRealm authenticate 
SEVERE: Unexpected error 
javax.security.auth.login.LoginException: No LoginModules configured for GdiaLogin 
    at javax.security.auth.login.LoginContext.init(Unknown Source) 
    at javax.security.auth.login.LoginContext.<init>(Unknown Source) 
    at org.apache.catalina.realm.JAASRealm.authenticate(JAASRealm.java:392) 
    at org.apache.catalina.realm.JAASRealm.authenticate(JAASRealm.java:332) 
    at org.apache.catalina.authenticator.BasicAuthenticator.authenticate(BasicAuthenticator.java:158) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:544) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 

`

在context.xml中:

<Realm className="org.apache.catalina.realm.JAASRealm" 
appName="GdiaLogin" 
userClassNames="org.ktu.gdia.core.security.UserPrincipal" 
roleClassNames="org.ktu.gdia.core.security.RolePrincipal" /> 

在的jaas.config(我敢肯定的Tomcat找到它是正確的,因爲我在eclipse中爲「運行配置」添加了正確路徑):

GdiaLogin { 
    org.ktu.gdia.core.security.GdiaLoginModule required debug=true; 
}; 

我假設必須有有毛病的jaas.config ...

我的登錄模塊,不知道如果我需要在這裏提供它,雖然,這幾乎是直接從一個教程我一直在下面:

package org.ktu.gdia.core.security; 

import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Map; 

import javax.security.auth.Subject; 
import javax.security.auth.callback.Callback; 
import javax.security.auth.callback.CallbackHandler; 
import javax.security.auth.callback.NameCallback; 
import javax.security.auth.callback.PasswordCallback; 
import javax.security.auth.callback.UnsupportedCallbackException; 
import javax.security.auth.login.LoginException; 
import javax.security.auth.spi.LoginModule; 

import org.ktu.gdia.core.businesslogic.ControllerFactory; 
import org.ktu.gdia.core.interfaces.SecurityControllerInterface; 

public class GdiaLoginModule implements LoginModule { 

    private CallbackHandler handler; 
    private Subject subject; 
    private UserPrincipal userPrincipal; 
    private RolePrincipal rolePrincipal; 
    private String login; 
    private List<String> userGroups; 

    private SecurityControllerInterface securityController; 


    @Override 
    public void initialize(Subject subject, CallbackHandler callbackHandler, 
      Map<String, ?> sharedState, Map<String, ?> options) { 

     try { 

     securityController = ControllerFactory.getInstance().getSecurityController(); 

    } catch (ClassNotFoundException | InstantiationException 
      | IllegalAccessException e) { 

     throw new RuntimeException("Failed to initialize SecurityController in " + this.getClass().getSimpleName(), e); 
    } 
     handler = callbackHandler; 
     this.subject = subject; 
    } 

    @Override 
    public boolean login() throws LoginException { 

    Callback[] callbacks = new Callback[2]; 
    callbacks[0] = new NameCallback("login"); 
    callbacks[1] = new PasswordCallback("password", true); 

    try { 
     handler.handle(callbacks); 
     String name = ((NameCallback) callbacks[0]).getName(); 
     String password = String.valueOf(((PasswordCallback) callbacks[1]) 
      .getPassword()); 

     // Here we validate the credentials against some 
     // authentication/authorization provider. 
     // It can be a Database, an external LDAP, 
     // a Web Service, etc. 
     // For this tutorial we are just checking if 
     // user is "user123" and password is "pass123" 

     if (securityController.credentialsValid(name, password)) { 

      // TODO authenticate 

      login = name; 
      userGroups = new ArrayList<String>(); 
      userGroups.add("admin"); 
      return true; 

     } 

     if (name != null && 
      name.equals("user123") && 
      password != null && 
      password.equals("pass123")) { 

     // We store the username and roles 
     // fetched from the credentials provider 
     // to be used later in commit() method. 
     // For this tutorial we hard coded the 
     // "admin" role 
     login = name; 
     userGroups = new ArrayList<String>(); 
     userGroups.add("admin"); 
     return true; 
     } 

     // If credentials are NOT OK we throw a LoginException 
     throw new LoginException("Authentication failed"); 

    } catch (IOException e) { 
     throw new LoginException(e.getMessage()); 
    } catch (UnsupportedCallbackException e) { 
     throw new LoginException(e.getMessage()); 
    } 

    } 

    @Override 
    public boolean commit() throws LoginException { 

    userPrincipal = new UserPrincipal(login); 
    subject.getPrincipals().add(userPrincipal); 

    if (userGroups != null && userGroups.size() > 0) { 
     for (String groupName : userGroups) { 
     rolePrincipal = new RolePrincipal(groupName); 
     subject.getPrincipals().add(rolePrincipal); 
     } 
    } 

    return true; 
    } 

    @Override 
    public boolean abort() throws LoginException { 
    return false; 
    } 

    @Override 
    public boolean logout() throws LoginException { 
    subject.getPrincipals().remove(userPrincipal); 
    subject.getPrincipals().remove(rolePrincipal); 
    return true; 
    } 

} 

編輯:在eclipse我的運行配置參數爲Tomcat:

-Dcatalina.base="D:\Dropbox\EclipseWorkspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp7" -Dcatalina.home="D:\Servers\GenTreeUploader_Tomcat7" -Dwtp.deploy="D:\Dropbox\EclipseWorkspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp7\wtpwebapps" -Djava.endorsed.dirs="D:\Servers\GenTreeUploader_Tomcat7\endorsed" -Djava.security.auth.login.config="D:\Dropbox\EclipseWorkspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp7\conf\jaas.config" 

嘛?有任何想法嗎?

+0

你在哪裏放置了你的context.xml文件?它需要位於META-INF文件夾內。 – JamesB

+0

@JamesB它在WebContent/META-INF /文件夾中,以及自動生成的MANIFEST.MF –

回答

17

根據http://tomcat.apache.org/tomcat-7.0-doc/realm-howto.html#JAASRealm

您應該建立一個login.config文件Java和Tomcat的訴說,其中通過設置環境變量指定其位置到JVM,例如找到它: JAVA_OPTS=$JAVA_OPTS -Djava.security.auth.login.config=$CATALINA_BASE/conf/jaas.config

新增

對於Windows開放startup.bat 添加以下行:set JAVA_OPTS=%JAVA_OPTS% -Djava.security.auth.login.config=%CATALINA_HOME%/conf/jaas.configokHome

例如

:okHome 
set JAVA_OPTS=%JAVA_OPTS% -Djava.security.auth.login.config=%CATALINA_HOME%/conf/jaas.config 
set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat" 
+0

嗯,我有點不知道在哪裏以及如何設置該環境變量,所以我只是添加它來運行配置,但它確實我相信找到jaas.config文件,因爲如果我爲配置文件指定了錯誤的路徑,它會告訴我它找不到該文件,現在它不會抱怨找不到該文件。我認爲文件內部出現了問題,但也許你是對的。那麼你能告訴我如何設置它嗎?它在Windows,系統設置,高級設置以及通過添加JAVA_OPTS,或者如何? –

+0

我真的不知道如何設置它,它是JAVA_OPTS作爲一個新的環境變量和值:「-Djava.security.auth.login.config == $ CATALINA_BASE/conf/jaas.config」?那麼tomcat如何知道使用它呢? –

+0

答案更新 – Michael

2

有點晚了答案,但萬一有人是有同樣的問題,使在Eclipse中的JAAS自定義模塊:你必須通過在其啓動參數的jaas.config文件到Tomcat的位置。這樣做在Eclipse的方式是:

  1. 雙擊服務器選項卡上的Tomcat實例
  2. 點擊「打開啓動配置」
  3. 在「參數」選項卡中,有一個VM參數輸入文本。
  4. 附加您的參數:-Djava.security.auth.login.config = 「」,即:

    -Djava.security.auth.login.config = 「d:\ tomcat的\ 7.0.50」 \的conf \ JAAS。配置」

  5. 單擊應用,確定並重新啓動服務器
0

我有完全相同的問題:

javax.security.auth.login.LoginException: No LoginModules configured for OwnModule 

但到文件的jaas.config是正確的道路,我相信,因爲當我的jaas.config做語法錯誤,我得到異常:

java.io.IOException: Configuration Error: 

我解決了這個由改變編碼文件「jaas.config」!首先我以UTF-8創建了這個文件,然後我提到了異常。當我將編碼更改爲ANSI時,它一直在運行而沒有問題!有點瘋狂。

1

如果您將Tomcat 7作爲服務運行,則不能使用.bat文件(它們不會被調用)。

但是,您可以運行/ bin目錄中找到的.EXE Tomcat7w.exe。您將看到一個帶有Java選項卡的面板。您可以在其中添加-D屬性(例如指向您的jaas.config文件)。

相關問題