001package org.apache.hadoop.security; 002 003import java.util.HashMap; 004import java.util.Map; 005 006import javax.security.auth.login.AppConfigurationEntry; 007import javax.security.auth.login.Configuration; 008 009public class DynamicLoginConfiguration extends Configuration { 010 private final Configuration baseConfig; 011 private final Map<String, ?> overrideOptions; 012 013 public class OverrideAppConfigurationEntry extends AppConfigurationEntry { 014 015 public OverrideAppConfigurationEntry(AppConfigurationEntry base) { 016 super(base.getLoginModuleName(), base.getControlFlag(), base.getOptions()); 017 } 018 019 @Override 020 public Map<String, ?> getOptions() { 021 Map<String, ?> baseOptions = super.getOptions(); 022 Map<String, Object> newOption = new HashMap<String, Object>(); 023 newOption.putAll(baseOptions); 024 newOption.putAll(overrideOptions); 025 return newOption; 026 } 027 } 028 029 public DynamicLoginConfiguration(Configuration base, Map<String,?> options) { 030 this.baseConfig = base; 031 this.overrideOptions = options; 032 } 033 034 /** 035 * Only goal here is to override the values of options at runtime. 036 * 037 * @param appName 038 * @return 039 */ 040 @Override 041 public AppConfigurationEntry[] getAppConfigurationEntry(String appName) { 042 AppConfigurationEntry[] app = baseConfig.getAppConfigurationEntry(appName); 043 if (app == null) { 044 return null; 045 } 046 047 AppConfigurationEntry[] newEntries = new AppConfigurationEntry[app.length]; 048 for (int i = 0; i < app.length; i++ ) { 049 AppConfigurationEntry entry = app[i]; 050 newEntries[i] = new OverrideAppConfigurationEntry(entry); 051 } 052 return newEntries; 053 } 054}