Поставщики веб-логики

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

Теперь мне также нужно проверить роли этого пользователя, но я не понимаю, может ли тот же провайдер позаботиться об аутентификации и сопоставлении ролей, или мне нужно обратиться к другому провайдеру.

Я пытался создать другого провайдера для сопоставления ролей, но я не могу его найти или не ищу в нужном месте для его настройки, но мой тип MBean также не требует вставки каких-либо конфигураций.

Кто-нибудь может мне с этим помочь? Я пытался найти примеры сопоставления ролей, но безуспешно.

Спасибо


person Lopez    schedule 08.10.2015    source источник


Ответы (1)


Взгляните на руководство Oracle: Как разработать настраиваемого поставщика сопоставления ролей

Этот процесс очень похож на создание провайдера аутентификации, единственная разница - это интерфейсы, которые вам нужно реализовать.

Теперь о моей реализации (я предполагаю, что я знаю о создании поставщика MBean с помощью WebLogicMBeanMaker, поскольку вы уже создали поставщика аутентификации): вам нужны 3 файла, XML-файл с конфигурацией, поставщик и реализация роли.

Файл конфигурации:

<?xml version="1.0" ?>
<!DOCTYPE MBeanType SYSTEM "commo.dtd">

<MBeanType
 Name          = "MYRoleMapper"
 DisplayName   = "MYRoleMapper"
 Package       = "MY.security"
 Extends       = "weblogic.management.security. authorization.RoleMapper"
 PersistPolicy = "OnUpdate"
>
 <MBeanAttribute
  Name          = "ProviderClassName"
  Type          = "java.lang.String"
  Writeable     = "false"
  Preprocessor  = "weblogic.management.configuration.LegalHelper.checkClassName(value)"
  Default       = "&quot;MY.security.MYRoleMapperProviderImpl&quot;"
 />

 <MBeanAttribute
  Name          = "Description"
  Type          = "java.lang.String"
  Writeable     = "false"
  Default       = "&quot;MY RM provider &quot;"
 />

 <MBeanAttribute
  Name          = "Version"
  Type          = "java.lang.String"
  Writeable     = "false"
  Default       = "&quot;1.2&quot;"
 />

</MBeanType>

Фактический поставщик MYRoleMapperProviderImpl.java:

public class MYRoleMapperProviderImpl implements RoleProvider, RoleMapper {
    private String description;
    private static final Map<String, SecurityRole> NO_ROLES = Collections.unmodifiableMap(new HashMap<String, SecurityRole>(1));

    private final static String RESSOURCE_URL = "<url>";
    private final static String RESSOURCE_EJB = "<ejb>";

    private enum rollen {
        READER;
    }

    @Override
    public void initialize(ProviderMBean mbean, SecurityServices services) {
        description = mbean.getDescription() + "\n" + mbean.getVersion();
    }

    @Override
    public String getDescription() {
        return description;
    }

    @Override
    public void shutdown() {

    }

    @Override
    public RoleMapper getRoleMapper() {
        return this;
    }

    @Override
    public Map<String, SecurityRole> getRoles(Subject subject, Resource resource, ContextHandler handler) {
        Map<String, SecurityRole> roles = new HashMap<String, SecurityRole>();
        Set<Principal> principals = subject.getPrincipals();
        for (Resource res = resource; res != null; res = res.getParentResource()) {
            getRoles(res, principals, roles);
        }
        if (roles.isEmpty()) {
            return NO_ROLES;
        }
        return roles;
    }

    private void getRoles(Resource resource, Set<Principal> principals, Map<String, SecurityRole> roles) {
        if (resource.getType() == RESSOURCE_URL || resource.getType() == RESSOURCE_EJB) {
                            roles.put(rollen.READER.toString(), new MYSecurityRoleImpl(rollen.READER.toString(), "READER Rolle"));          
            }
    }
}

И абсолютно простая реализация роли:

package MY.security;

import weblogic.security.service.SecurityRole;

public class MYSecurityRoleImpl implements SecurityRole {

    private String _roleName;
       private String _description;
       private int _hashCode;

       public MYSecurityRoleImpl(String roleName, String description)
       {
          _roleName = roleName;
          _description = description;
          _hashCode = roleName.hashCode() + 17;
       }

       public boolean equals(Object secRole)
       {
          if (secRole == null) 
          {
             return false;
          }

          if (this == secRole) 
          {
             return true;
          }

          if (!(secRole instanceof MYSecurityRoleImpl)) 
          {
             return false;
          }

          MYSecurityRoleImpl anotherSecRole = (MYSecurityRoleImpl)secRole;

          if (!_roleName.equals(anotherSecRole.getName())) 
          {
             return false;
          }

          return true;
       }

       public String toString () { return _roleName; }
       public int hashCode () { return _hashCode; }
       public String getName () { return _roleName; }
       public String getDescription () { return _description; }
}
person Slettal    schedule 09.10.2015
comment
Спасибо за ваш ответ. Что касается количества провайдеров, могу ли я сделать это в одном? Авторизация и сопоставление ролей вместе, или мне нужно разделить их? - person Lopez; 09.10.2015
comment
Я не уверен, так как раньше я реализовал только RoleMappingProvider. Если вы посмотрите на пример, в AuthenticationProvider есть метод addGroupsForSubject (String userName). Возможно, стоит попробовать - person Slettal; 09.10.2015
comment
хорошо, и jar поставщика сопоставления ролей будет в mbeantypes на сервере правильно? Есть ли способ отправить мне проверенный вами код сопоставления ролей? - person Lopez; 09.10.2015
comment
Да, он тоже находится в папке mbeantypes. И конечно, я могу показать вам код. Просто нужно удалить из него кое-что, относящееся к конкретной компании, прежде чем я смогу опубликовать его здесь) - person Slettal; 09.10.2015
comment
Спасибо за быстрый ответ, Слеттал. Поставщик сопоставления ролей должен отображаться на вкладке «Сопоставление ролей» внутри вкладки «Поставщики» внутри myrealm, верно? - person Lopez; 09.10.2015
comment
Я не могу понять, почему цель Run ant не возвращает никаких ошибок и не создает банку, но поставщик не отображается в списке для выбора - person Lopez; 09.10.2015
comment
Да, вы сможете выбрать его как RoleProvider. Проверьте журналы weblogic при запуске сервера на наличие ошибок, проверьте файл .xml на наличие опечаток. - person Slettal; 12.10.2015
comment
Я открыл сгенерированный файл jar и увидел, что файлов java внутри созданного мной пакета нет. Полагаю, поэтому упоминания о нем не будет в списке. Когда я запускаю файл сборки, я не получаю никаких ошибок. Разве я не могу использовать сборку провайдера аутентификации в roleMapper? - person Lopez; 12.10.2015
comment
Да, сборка должна быть такой же. В конце концов, это всего лишь призыв MBEAN Maker: ‹java classname = weblogic.management.commo.WebLogicMBeanMaker fork = true failonerror = true› ‹jvmarg line = -Dfiles =. / Build -DMDFDIR =. / Build -DMJF =. / build / MYRoleMapper.jar -DtargetNameSpace = $ {namespace} -DpreserveStubs = true -DcreateStubs = true / ›‹/java› - person Slettal; 12.10.2015
comment
Если вы этого не видели, у Oracle есть образец провайдера безопасности пользователей базы данных с рабочим заданием по сборке на их домашней странице. Это тот, который я использовал: oracle.com/technetwork/indexes/ samplecode / - person Slettal; 12.10.2015
comment
Хорошо, я успешно скомпилировал поставщика и внес его в список веб-логики для сопоставителя ролей. Но у меня есть некоторые функции, которые нужно реализовать, например removeRolesForComponent, getRoles и т. Д. Здесь я добавляю запросы в свою базу данных? Я не могу найти пример, даже со страниц оракула - person Lopez; 12.10.2015
comment
Да, см. Мой опубликованный код. У провайдера есть метод getRoles. Он вызывается Weblogic при каждом доступе к любому ресурсу (я ограничил это запросами url и ejb). Вот где вы должны добавить запрос в базу данных. - person Slettal; 13.10.2015