簡體   English   中英

使用ejb遠程訪問和自定義登錄模塊/ applicationrealm的Wildfly設置也被稱為

[英]Wildfly setup using ejb remote access and custom login module / applicationrealm is additionally called

當激活用於EJB遠程認證的自定義登錄模塊時,還會調用applicationrealm進行認證。 不幸的是,我不知道為什么。

在當前實現中,用戶登錄到customlogin模塊中,並登錄到ejb中。 僅在用戶名和密碼相同的用戶在application-users.properties中注冊后,此操作才能成功。 更改用戶,使登錄名不再起作用。 在這一點上,我目前還不清楚身份驗證是僅通過application-users.properties(ApplicationRealm)運行還是通過application-users.properties和自定義登錄模塊組合運行。 以及為什么要通過application-users.properties進行身份驗證。

目的是通過自定義登錄模塊完全認證EJB遠程訪問。

進行以下設置:

EJB遠程客戶端屬性:

props.put("java.naming.factory.initial", "org.jboss.naming.remote.client.InitialContextFactory");  
props.put(java.naming.factory.url.pkgs, "org.jboss.ejb.client.naming");  
props.put("jboss.naming.client.ejb.context", false);  
props.put("org.jboss.ejb.client.scoped.context", true);  
props.put("endpoint.name", "client-endpoint");  
props.put("remote.connections", "default");  
props.put("remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED", false);  
props.put("remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS", false);  
props.put("remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT", "false");  

props.put("java.naming.provider.url", "http-remoting://127.0.0.1:8080");  
props.put("remote.connection.default.host", "127.0.0.1");  
props.put("remote.connection.default.port", "8080");  
props.put("remote.connection.default.username", "username");  
props.put("remote.connection.default.password", "password"); 

ejb網址:

ejb:/my-app/MyServiceImpl!com.some.MyServiceInterface  

基於常規standalone.xml的standalone.xml配置(不完整):

安全領域

<security-realm name="MyRealm">  
        <authentication>  
                    <jaas name="com.some.MyCustomLoginModule"/>  
     </authentication>  
</security-realm>

安全域

<security-domain name="MySecurityDomain" cache-type="default">  
        <authentication>  
                <login-module code="com.some.MyCustomLoginModule" flag="required" module="login.my">  
                            <module-option name="usersProperties" value="user.properties"/>  
                            <module-option name="rolesProperties" value="roles.properties"/>  
             </login-module>  
     </authentication>  
</security-domain>

遠程子系統

<subsystem xmlns="urn:jboss:domain:remoting:3.0">  
            <endpoint/>  
            <http-connector name="http-remoting-connector" connector-ref="default" security-realm="MyRealm"/>  
</subsystem>

實現方式:

服務展示

@Stateless  
@SecurityDomain("MySecurityDomain")  
@DeclareRoles("user")  
public class MyServiceImpl implements MyService {  

     private static final Logger logger = Logger.getLogger(MyServiceImpl .class);  

     @Resource  
     private EJBContext ejbContext;  

     @PermitAll  
     public String getPrincipalName() {  
          logger.info("Principal: " + ejbContext.getCallerPrincipal().getName());  
          return ejbContext.getCallerPrincipal().getName();  
     }  
} 

服務接口

@Remote  
public interface MyService {  
     public String getPrincipalName();  
}

定制登錄模塊

import java.security.Principal;  
import java.util.Map;  
import javax.security.auth.Subject;  
import javax.security.auth.callback.CallbackHandler;  
import javax.security.auth.login.LoginException;  
import org.jboss.logging.Logger;  
import org.jboss.security.auth.spi.UsersRolesLoginModule;  

public class CustomLoginModule extends UsersRolesLoginModule {  
    private CustomPrincipal principal;  

     private static final Logger logger = Logger.getLogger(CustomLoginModule.class);  

     @Override  
     public void initialize(Subject arg0, CallbackHandler arg1, Map<String, ?> arg2, Map<String, ?> arg3) {  
          logger.info("init module from main class");  
          super.initialize(arg0, arg1, arg2, arg3);  
     }  

     public boolean login() throws LoginException {  
          logger.info("Calling login()");  
          logger.info("User before: " + getUsername());  

          boolean login = super.login();  

          logger.info("User: " + getUsername());  
          logger.info("Password: " + getUsersPassword());  

          if (login) {  
               principal = new CustomPrincipal(getUsername(), "An user description!");  
          }  
          return login;  
     }  

     protected Principal getIdentity() {  
          return principal != null ? principal : super.getIdentity();  
     }  
}  

我正在研究的服務器-客戶端產品還通過EJB以及身份驗證用戶名和密碼的后端完全處理了登錄過程。 Wildfly只為我們的服務器提供服務,我們不使用Wildfly的管理控制台,因此不使用Wildfly的application-users

我們只需像這樣設置ApplicationRealm:

 <security-realm name="MyRealm"> <authentication> <local default-user="$local" allowed-users="*" skip-group-loading="true"/> </authentication> </security-realm> 

jboss-ejb.client.properties:

 remote.connections=default remote.connection.default.host=localhost remote.connection.default.port=8080 remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false 

並且登錄過程僅通過我們的EJB處理。

注意 :這可能不是每個具有類似設置的解決方案。 我們產品的性質使我們能夠做到這一點,並且我們擁有適當的證書,並且所有這些僅在內部運行在客戶網絡和防火牆之后。

我發現了我的錯誤。

領域配置錯誤

 <jaas name="com.some.MyCustomLoginModule"/>

代替

 <jaas name="MySecurityDomain"/>

我配置了登錄模塊的類,而不是安全域的邏輯名。 而不是拋出錯誤-jboss進行后備身份驗證。 嗯...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM