2
我有一些耳朵部署在JBoss AS7與 的jboss-app.xml的JBoss應用服務器7遠程獨立客戶端驗證
<jboss-app xmlns="http://www.jboss.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
version="7.0" xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee ">
<security-domain>FooDomain</security-domain>
在standalone.xml我
<security-realm name="ApplicationRealm">
<authentication>
<jaas name="FooDomain"/>
</authentication>
</security-realm>
...
<security-domain name="FooDomain" cache-type="default">
<authentication>
<login-module code="Remoting" flag="optional">
<module-option name="password-stacking" value="useFirstPass"/>
</login-module>
<login-module code="Database" flag="required">
<module-option name="dsJndiName" value="java:/MyDS"/>
<module-option name="principalsQuery" value="select password from users where user_id=?"/>
<module-option name="rolesQuery" value="select role, 'Roles' from roles where user_id=?"/>
<module-option name="password-stacking" value="useFirstPass"/>
</login-module>
</authentication>
</security-domain>
我可以從獨立客戶端查找一些ejb,當我使用這樣的代碼時,身份驗證成功:
final Hashtable<Object, Object> p = new Hashtable<Object, Object>();
p.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
p.put(Context.SECURITY_PRINCIPAL, username);
p.put(Context.SECURITY_CREDENTIALS, password);
p.put("jboss.naming.client.ejb.context", true);
p.put(Context.PROVIDER_URL, "remote://10.10.1.18:4447");
p.put("jboss.naming.client.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT", "false");
p.put(Context.INITIAL_CONTEXT_FACTORY, org.jboss.naming.remote.client.InitialContextFactory.class.getName());
context = new InitialContext(p);
的問題是,如果我錯了提供憑據,我在調試控制檯
javax.security.sasl.SaslException: Authentication failed: all available authentication mechanisms failed
看到,但我不能抓住它。
服務器日誌(不重要的部分板缺):
TRACE [DatabaseServerLoginModule] initialize
TRACE [DatabaseServerLoginModule] Security domain: FooDomain
TRACE [DatabaseServerLoginModule] DatabaseServerLoginModule, dsJndiName=java:/MyDS
TRACE [DatabaseServerLoginModule] principalsQuery=select password from users where user_id=?
TRACE [DatabaseServerLoginModule] rolesQuery=select role, 'Roles' from roles where user_id=?
TRACE [DatabaseServerLoginModule] suspendResume=true
TRACE [DatabaseServerLoginModule] login
TRACE [DatabaseServerLoginModule] suspendAnyTransaction
TRACE [DatabaseServerLoginModule] Excuting query: select password from users where user_id=?, with username: test
TRACE [DatabaseServerLoginModule] Obtained user password
TRACE [DatabaseServerLoginModule] resumeAnyTransaction
DEBUG [DatabaseServerLoginModule] Bad password for username=test
TRACE [DatabaseServerLoginModule] abort
當我嘗試使用LoginContext的只是什麼也沒有發生在服務器上。 配置
public class DefaultJassConfiguration extends Configuration {
@Override
public AppConfigurationEntry[] getAppConfigurationEntry(String name) {
Map options = new HashMap();
options.put("debug", true);
AppConfigurationEntry[] entries = {
new AppConfigurationEntry("org.jboss.security.ClientLoginModule", AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, options)
};
return entries;
}
}
測試
Configuration.setConfiguration(new DefaultJassConfiguration());
try {
LoginContext lc = new LoginContext("FooDomain", new UsernamePasswordHandler("test", "test".toCharArray()));
lc.login();
System.out.println(lc.getSubject());
} catch (LoginException e) {
e.printStackTrace();
}
也許LoginContext的不知道服務器地址?我嘗試添加
System.setProperty("java.naming.provider.url", "remote://10.10.1.18:4447");
但是沒有效果。
如何使LoginContext有效?或者如何捕捉SaslException? 我認爲使用方法總是返回true並在登錄後調用它,但它看起來很醜。
P.S.我很抱歉我的英語(這讓我有些害羞)
你想抓住客戶端上的例外嗎? – DaTroop
在客戶端是的 – fpu
您可以嘗試擴展安全模塊類並在try/catch中包裝安全檢查代碼。萬一你會得到一個例外,把它扔回客戶端。我只是希望這個例外不再被抑制。 – DaTroop