Wildfly 15 получает EJBContext в синглтоне от пользователя jax rs, вошедшего в систему - PullRequest
0 голосов
/ 16 января 2019

Я хочу получить принципала вызывающего абонента в синглтоне от вошедшего в систему пользователя. пользователь аутентифицируется по отношению к услуге остальных с именем пользователя / паролем

домен безопасности находится в jboss-web.xml в войне

<security-domain>application-security</security-domain>

Конечная точка в войне:

@Path("/message/{message}")
public class MyRessource
{  
   @EJB
   MySingleton singletonBean;

   @GET
   public Response resource(@PathParam("message") String message)
   {        
        singletonBean.printText(message);
        System.out.println("called from: " + ctx.getUserPrincipal().getName());
}

синглтон находится в собственном проекте и предоставляется в качестве зависимости на войне.

@Stateless
public class MySingletonBean implements MySingleton
{

    @Resource
    EJBContext context;

    @Resource
    SessionContext ctx;

  public void printText(String text) {
      System.out.println(text + ":: EJBContext: " + context.getCallerPrincipal().getName() + "  SessionContext: " + ctx.getCallerPrincipal().getName());      
  }

}

my web.xml:

<web-app>
    <security-role>
        <role-name>Admin</role-name>
    </security-role>

    <security-constraint>
        <web-resource-collection>
            <url-pattern>/*</url-pattern>
            <http-method-omission>OPTIONS</http-method-omission>
        </web-resource-collection>
        <auth-constraint>
            <role-name>Admin</role-name>
        </auth-constraint>
    </security-constraint>
    <login-config>
        <auth-method>BASIC</auth-method>
    </login-config>
</web-app>

автономный набитый-ha.xml

<subsystem xmlns="urn:wildfly:elytron:5.0" ...>
   [...]
   <security-domain name="application-security" default-realm="application-properties" permission-mapper="default-permission-mapper">
      <realm name="application-properties"/>
   </security-domain>
   [...]
</subsystem>
   [...]

<http-authentication-factory name="application-security-http" security-domain="application-security" http-server-mechanism-factory="global">
   <mechanism-configuration>
      <mechanism mechanism-name="BASIC"/>
   </mechanism-configuration>
</http-authentication-factory>
[...]

<security-domains>
   <security-domain name="application-security" default-realm="application-properties" permission-mapper="default-permission-mapper">
      <realm name="application-properties"/>
    </security-domain>
   [...]
</security-domains>
[...]

<subsystem xmlns="urn:jboss:domain:security:2.0">
   <security-domains>
      <security-domain name="application-security">
         <authentication>
            <login-module code="UsersRoles" flag="required">
               <module-option name="usersProperties" value="file://${jboss.server.config.dir}/context-users.properties"/>
                <module-option name="rolesProperties" value="file://${jboss.server.config.dir}/context-roles.properties"/>
             </login-module>
          </authentication>
     </security-domain>
     [...]
</subsystem>
[...]

<subsystem xmlns="urn:boss:domain:undertow"...>
    <application-security-domains>
        <application-security-domain name="application-security" http-authentication-factory="application-security-http"/>
    </application-security-domains>
    [...]
</subsystem>

Но я всегда становлюсь анонимным как принципал.

Что я сделал не так?

1 Ответ

0 голосов
/ 20 января 2019

У вас есть как минимум три проблемы здесь:

  1. <subsystem xmlns="urn:jboss:domain:security:2.0"> - это устаревший элемент конфигурации, который не связан с elytron;

  2. Вы полностью отсутствует конфигурация безопасности ejb3;

  3. Ваш метод EJB не защищен с помощью @RolesAllowed(...).

У меня работает похожий пример:

  1. Создание elytron царства свойств:

    /subsystem=elytron/properties-realm=DemoPropsRealm:add(groups-attribute=groups,\
       groups-properties={\
         path=demo-roles.properties,relative-to=jboss.server.config.dir},\
       users-properties={\
         path=demo-users.properties,relative-to=jboss.server.config.dir,plain-text=true})
    
  2. Создание elytron домена безопасности:

    /subsystem=elytron/security-domain=DemoDomain:add(\
       realms=[{realm=DemoPropsRealm,role-decoder=groups-to-roles}],\
       default-realm=DemoPropsRealm,permission-mapper=default-permission-mapper)
    
  3. Создайте elytron фабрику http-аутентификации, которая сопоставлена ​​с нашим DemoDomain:

    /subsystem=elytron/http-authentication-factory=demo-http-auth:add(\
       http-server-mechanism-factory=global,\
       security-domain=DemoDomain,\
       mechanism-configurations=[{\
         mechanism-name=BASIC,\
         mechanism-realm-configurations=[{\
           realm-name=DemoApplicationDomain\
         }]\
       }])
    
  4. Сопоставить домен безопасности приложения ejb3 с нашим DemoDomain

    /subsystem=ejb3/application-security-domain=\
        DemoApplicationDomain:add(security-domain=DemoDomain)
    
  5. Свяжите домен безопасности приложения undertow с нашей фабрикой http-аутентификации:

    /subsystem=undertow/application-security-domain=\
        DemoApplicationDomain:add(http-authentication-factory=demo-http-auth)
    

    "DemoApplicationDomain" будет именем области в элементе login-config файла web.xml и security-domain в файле jboss-web.xml.

  6. Объявите разрешенные роли в вашем методе EJB:

    @RolesAllowed("Admin")
    public void printText(String text) {
        System.out.println(text + ":: EJBContext: " + context.getCallerPrincipal().getName()
         + "  SessionContext: " + ctx.getCallerPrincipal().getName());      
    }
    

Пример источника в GitHub: jax-rs-basic-auth .

...