2016-11-03 7 views
0

WebアプリケーションをTomcatで起動して実行しています。今、WebLogic 12c内でアプリケーション(warファイル)を実行する必要があります。私は十分な情報を見つけることができませんでしたWebLogic用JAAS設定

1)は、warファイル内のweb.xmlファイルと一緒に必須weblogic.xmlのですか?チュートリアルでは、weblogic.xmlでコンテキストやその他の設定を設定することについて言及していますが、必須ではありません。

2)WebLogic内でJAASレルムを設定する必要があります。私はレルムを設定しようとしましたが、何かが設定に縛られているのを知らないのです。誰かが私に適切なチュートリアルを指し示すことができるか、JAASセットアップに必要なステップを提供できますか?

私は-Djava.security.auth.login.config =%DOMAIN_HOME%\ jaas.configをstartWebLogic.cmdファイル内に追加しました。

以下は私のログインモジュールのコードです:チュートリアルの一部で

public class AuthLoginModule implements LoginModule { 
    private static Logger logger = Logger.getLogger(AuthLoginModule.class); 
    // initial state 
    private Subject subject; 
    private CallbackHandler callbackHandler; 
    private Map<String, ?> sharedState; 
    private Map<String, ?> options; 
    // the authentication status 
    private boolean succeeded = false; 
    private boolean commitSucceeded = false; 

    // username and password 
    private String username; 
    private String password; 
    Map<String,String> userData = new HashMap<String,String>(); 

    private AuthPrincipal userPrincipal; 

    public AuthLoginModule() throws WebAuthServiceException { 
     super(); 
    } 

    public void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState, Map<String, ?> options) { 
     this.subject = subject; 
     this.callbackHandler = callbackHandler; 
     this.setSharedState(sharedState); 
     this.setOptions(options); 
     String appName = options.get(WebAuthConstants.APP_UNIQUE_NAME).toString(); 
     logger.info("AppName in AuthLoginModule: " + appName); 
    } 

    public boolean login() throws LoginException { 
     if (callbackHandler == null) 
      throw new LoginException("Error: no CallbackHandler available " + "to garner authentication information from the user"); 

     Callback[] callbacks = new Callback[2]; 
     callbacks[0] = new NameCallback("user name: "); 
     callbacks[1] = new PasswordCallback("password: ", false); 
     try { 
      callbackHandler.handle(callbacks); 
      username = ((NameCallback) callbacks[0]).getName(); 
      char[] tmpPassword = ((PasswordCallback) callbacks[1]).getPassword(); 
      if (tmpPassword == null) { 
       // treat a NULL password as an empty password 
       tmpPassword = new char[0]; 
      } 
      password = new String(tmpPassword); 
      if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) { 
       throw new LoginException("User name or password is empty"); 
      } 

     } catch (java.io.IOException ioe) { 
      throw new LoginException(ioe.toString()); 
     } catch (UnsupportedCallbackException uce) { 
      throw new LoginException("Error: " + uce.getCallback().toString() + " not available to garner authentication information " + "from the user"); 
     } 
     String validateUserCredData = validateUserCred(); 
     if (validateUserCredData!=null) { 
      if(JsonUtil.jsonFromString(validateUserCredData).get("statusCode").getAsInt()== HttpStatus.SC_UNAUTHORIZED) { 
       userData.put(DataConstants._USER_PWD_STATUS, DataConstants._RESET_USER_PWD); 
      } 
      succeeded = true; 
     } else { 
      succeeded = false; 
     } 
     return succeeded; 
    } 


    private String validateUserCred() { 
     try { 
      logger.info("Started validating user credentials for: " + username); 
      // If there is no error then user allowed to access all 
      UserClientService UserClientService = ClientServiceFactory.getInstance().getUserService(); 
      return UserClientService.validateUserCredentials(username, password); 
     } catch (Throwable e) { 
      logger.error("Exception while authentication user against Service API, Error Code: ", e); 
     } 
     return null; 
    } 

    public boolean commit() throws LoginException { 
     if (succeeded == false) { 
      return false; 
     } else { 
      // add a Principal (authenticated identity) to the Subject 
      // assume the user we authenticated is the SamplePrincipal 
      userPrincipal = new AuthPrincipal(username, password, userData); 
      if (!subject.getPrincipals().contains(userPrincipal)) 
       subject.getPrincipals().add(userPrincipal); 
      logger.info("Login Module successfully added user principal"); 
      // in any case, clean out state 
      username = null; 
      password = null; 
      commitSucceeded = true; 
      return true; 
     } 
    } 

    public boolean abort() throws LoginException { 
     if (succeeded == false) { 
      return false; 
     } else if (succeeded == true && commitSucceeded == false) { 
      // login succeeded but overall authentication failed 
      succeeded = false; 
      username = null; 
      password = null; 
      userPrincipal = null; 
     } else { 
      // overall authentication succeeded and commit succeeded, 
      // but someone else's commit failed 
      logout(); 
     } 
     return true; 
    } 

    public boolean logout() throws LoginException { 
     subject.getPrincipals().remove(userPrincipal); 
     succeeded = false; 
     succeeded = commitSucceeded; 
     username = null; 
     password = null; 
     userPrincipal = null; 
     logger.info("Login Module successfully removed user principal after successful logout"); 
     return true; 
    } 

    public Map<String, ?> getSharedState() { 
     return sharedState; 
    } 

    public void setSharedState(Map<String, ?> sharedState) { 
     this.sharedState = sharedState; 
    } 

    public Map<String, ?> getOptions() { 
     return options; 
    } 

    public void setOptions(Map<String, ?> options) { 
     this.options = options; 
    } 
} 

、私は、WebLogicへの特定の書かれたLoginModuleを見ることができましたが、私はそれがJ2EEを次のようにLoginModuleは任意のサーバ用に変更するべきではない気がします。

ご協力いただければ幸いです。

+0

'realm'はあなたが望むタグだとは思わないでください。 StackOverflowのRealmタグは、Realm Mobile Databaseに関連付けられています。 – teotwaki

+1

ありがとう、タグを削除しました。 – Azim

+1

以前はWebLogicにSSO製品を統合しました。 LoginModuleにWebLogic固有のPrincipalオブジェクトを作成する必要があるため、Principalを作成する部分はWebLogicにかなりバインドされています。私が試したことは、手動で設定を行うことです。私はそれをWebLogicのやり方で行い、MBeanを生成し、WebLogicのWebコンソールを使用して構成を作成しました。これを参照できます。https://docs.oracle.com/cd/E12890_01/ales/docs32/dvspisec/progrmng.html –

答えて

0

最後に、自分の必要に応じて動作するフォームベースのJAAS構成を作成しました。 コメント欄のKC Wongといくつかのブログでも提供されているoracle docsのリンクに従っています。

以下は、私が従った手順です。

1)まず、カスタム認証プロバイダを作成する必要があります。 LoginModule、AuthenticationProviderImplAuthenticationProviderV2を実装する)とMBean XMLを含むJavaプロジェクトを作成しました。 このMBean XMLには、MBeanTypeとMBeanAttributeに関する情報が含まれています。 詳細については、以下の重要なファイルをいくつか掲載しました。

WLAuthenticationProviderImplが

package com.abc.wls.security.providers.authentication; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.util.HashMap; 
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 weblogic.logging.NonCatalogLogger; 
import weblogic.security.principal.WLSGroupImpl; 
import weblogic.security.principal.WLSUserImpl; 

import com.google.gson.JsonObject; 
import com.google.gson.JsonParser; 

public class WLServerLoginModule implements LoginModule { 
    private static NonCatalogLogger logger = new NonCatalogLogger("WLServerLoginModule"); 
    // initial state 
    private Subject subject; 
    private CallbackHandler callbackHandler; 
    private Map<String, ?> sharedState; 
    private Map<String, ?> options; 
    // the authentication status 
    private boolean succeeded = false; 
    private boolean commitSucceeded = false; 

    // username and password 
    private String username; 
    private String password; 
    Map<String, String> userData = new HashMap<String, String>(); 
    private final JsonParser jsonParser = new JsonParser(); 

    private WLSAuthPrincipal userPrincipal; 

    public WLServerLoginModule() throws LoginException { 
     super(); 
    } 

    public void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState, Map<String, ?> options) { 
     logger.info("WLServerLoginModule.initialize"); 
     this.subject = subject; 
     this.callbackHandler = callbackHandler; 
     this.setSharedState(sharedState); 
     this.setOptions(options); 
     String appName = options.get("app-unique-name").toString(); 
     logger.info("AppName in WLServerLoginModule: " + appName); 
    } 

    public boolean login() throws LoginException { 
     logger.info("WLServerLoginModule.login"); 
     if (callbackHandler == null) 
      throw new LoginException("Error: no CallbackHandler available " + "to garner authentication information from the user"); 

     Callback[] callbacks = new Callback[2]; 
     callbacks[0] = new NameCallback("user name: "); 
     callbacks[1] = new PasswordCallback("password: ", false); 
     try { 
      callbackHandler.handle(callbacks); 
      username = ((NameCallback) callbacks[0]).getName(); 
      char[] tmpPassword = ((PasswordCallback) callbacks[1]).getPassword(); 
      if (tmpPassword == null) { 
       // treat a NULL password as an empty password 
       tmpPassword = new char[0]; 
      } 
      password = new String(tmpPassword); 
      if (isEmpty(username) || isEmpty(password)) { 
       throw new LoginException("User name or password is empty"); 
      } 
     } catch (java.io.IOException ioe) { 
      throw new LoginException(ioe.toString()); 
     } catch (UnsupportedCallbackException uce) { 
      throw new LoginException("Error: " + uce.getCallback().toString() + " not available to garner authentication information " + "from the user"); 
     } 

     try { 
      if (isValidUser(username, password)) { 
       succeeded = true; 
      } else { 
       succeeded = false; 
      } 
     } catch (Exception e) { 
      logger.error("Post validation exception e: ", e); 
      succeeded = false; 
     } 
     return succeeded; 
    } 

    private boolean isValidUser(String username, String password) { 
     // Your custom validation logic 
     return true; 
    } 


    public boolean commit() throws LoginException { 
     logger.info("WLServerLoginModule.commit"); 
     if (succeeded == false) { 
      return false; 
     } else { 
      // add a Principal (authenticated identity) to the Subject 
      // assume the user we authenticated is the SamplePrincipal 
      userPrincipal = new WLSAuthPrincipal(username, password, userData); 
      if (!subject.getPrincipals().contains(userPrincipal)) { 
       // subject.getPrincipals().add(new WLSUserImpl(username)); 
       subject.getPrincipals().add(userPrincipal); 
       logger.info("Custom User principal Added"); 
      } 
      subject.getPrincipals().add(new WLSUserImpl(username)); 
      subject.getPrincipals().add(new WLSGroupImpl("ABC_USERS")); 
      logger.info("Login Module successfully added user principal"); 
      if (subject != null && subject.getPrincipals() != null) { 
       logger.info("All user principals added: " + subject.getPrincipals()); 
       logger.info("All user principals count: " + subject.getPrincipals().size()); 
      } 
      // in any case, clean out state 
      username = null; 
      password = null; 
      commitSucceeded = true; 
      return true; 
     } 
    } 

    public boolean abort() throws LoginException { 
     logger.info("WLServerLoginModule.abort"); 
     if (succeeded == false) { 
      return false; 
     } else if (succeeded == true && commitSucceeded == false) { 
      // login succeeded but overall authentication failed 
      succeeded = false; 
      username = null; 
      password = null; 
      userPrincipal = null; 
     } else { 
      // overall authentication succeeded and commit succeeded, but 
      // someone else's commit failed 
      logout(); 
     } 
     return true; 
    } 

    public boolean logout() throws LoginException { 
     logger.info("WLServerLoginModule.logout"); 
     subject.getPrincipals().remove(userPrincipal); 
     succeeded = false; 
     succeeded = commitSucceeded; 
     username = null; 
     password = null; 
     userPrincipal = null; 
     logger.info("Login Module successfully removed user principal after successful logout"); 
     return true; 
    } 

    public Map<String, ?> getSharedState() { 
     return sharedState; 
    } 

    public void setSharedState(Map<String, ?> sharedState) { 
     this.sharedState = sharedState; 
    } 

    public Map<String, ?> getOptions() { 
     return options; 
    } 

    public void setOptions(Map<String, ?> options) { 
     this.options = options; 
    } 
} 

2)WLServerLoginModule.java

package com.abc.wls.security.providers.authentication; 

import java.util.HashMap; 

import javax.security.auth.login.AppConfigurationEntry; 
import javax.security.auth.login.AppConfigurationEntry.LoginModuleControlFlag; 

import weblogic.management.security.ProviderMBean; 
import weblogic.security.provider.PrincipalValidatorImpl; 
import weblogic.security.spi.AuthenticationProviderV2; 
import weblogic.security.spi.IdentityAsserterV2; 
import weblogic.security.spi.PrincipalValidator; 
import weblogic.security.spi.SecurityServices; 

public class WLAuthenticationProviderImpl implements AuthenticationProviderV2 { 
    private String description = "MyOwn WLAuthentication Provider"; 
    // private SimpleSampleAuthenticatorDatabase database; 
    private LoginModuleControlFlag controlFlag; 

    public void initialize(ProviderMBean mbean, SecurityServices services) { 
     System.out.println("WLAuthenticationProviderImpl.initialize"); 
     // WLAuthenticationProviderMBean mbean = 
     // (WLAuthenticationProviderMBean) mbean; 

     // SimpleSampleAuthenticatorMBean myMBean = 
     // (SimpleSampleAuthenticatorMBean) mbean; 
     // description = myMBean.getDescription() + "\n" + myMBean.getVersion(); 
     // database = new SimpleSampleAuthenticatorDatabase(myMBean); 
     // String flag = myMBean.getControlFlag(); 
     /* 
     * if (flag.equalsIgnoreCase("REQUIRED")) { controlFlag = 
     * LoginModuleControlFlag.REQUIRED; } else if 
     * (flag.equalsIgnoreCase("OPTIONAL")) { controlFlag = 
     * LoginModuleControlFlag.OPTIONAL; } else if 
     * (flag.equalsIgnoreCase("REQUISITE")) { controlFlag = 
     * LoginModuleControlFlag.REQUISITE; } else if 
     * (flag.equalsIgnoreCase("SUFFICIENT")) { controlFlag = 
     * LoginModuleControlFlag.SUFFICIENT; } else { throw new 
     * IllegalArgumentException("invalid flag value" + flag); } 
     */ 
    } 

    public String getDescription() { 
     System.out.println("WLAuthenticationProviderImpl.getDescription"); 
     return description; 
    } 

    public void shutdown() { 
     System.out.println("WLSecurityProviderImpl.shutdown"); 
    } 

    private AppConfigurationEntry getConfiguration(HashMap options) { 
     System.out.println("WLAuthenticationProviderImpl.getConfiguration"); 
     if (options == null) 
      options = new HashMap<>(); 
     options.put("app-unique-name", "xyz-ui"); 
     // return new 
     // AppConfigurationEntry("examples.security.providers.authentication.Simple.Simple.SampleLoginModuleImpl", 
     // controlFlag, options); 
     return new AppConfigurationEntry("com.abc.wls.security.providers.authentication.WLServerLoginModule", LoginModuleControlFlag.REQUIRED, options); 
    } 

    public AppConfigurationEntry getLoginModuleConfiguration() { 
     System.out.println("WLAuthenticationProviderImpl.getLoginModuleConfiguration"); 
     HashMap options = new HashMap(); 
     return getConfiguration(options); 
    } 

    public AppConfigurationEntry getAssertionModuleConfiguration() { 
     System.out.println("WLAuthenticationProviderImpl.getAssertionModuleConfiguration"); 
     HashMap options = new HashMap(); 
     options.put("IdentityAssertion", "true"); 
     return getConfiguration(options); 
    } 

    public PrincipalValidator getPrincipalValidator() { 
     return new PrincipalValidatorImpl(); 
    } 

    public IdentityAsserterV2 getIdentityAsserter() { 
     return null; 
    } 

} 

を.javaファイル私はWLSAbstractPrincipalに延びており、WLUserを実装して自分のカスタムAuthPrincipalを持っていると思いました。私のケースは若干異なります。私はAuthPrincipalにユーザー名、パスワード、およびユーザーに関するいくつかの重要な情報を保存したかったのです。したがって、私はこのカスタムAuthPrincipalを作成します。

3)次に、このカスタム認証プリンシパルを発行するbuild.xmlを作成します。

4)これからjarを生成した後、WebLogicでサポートされているデフォルトの認証プロバイダとともに{WL_HOME}/server/lib/mbeantypesの中にコピーしました。

5)これで、myrealmのデフォルトレルムを変更する必要があります。新しい認証プロバイダを任意の名前で作成し、作成したカスタム認証プロバイダの名前として[タイプ]を選択します。このAuth ProviderをREQUIREDとします。

関連する問題