Настройка Modeshape AuthenticationProvider

Я пытаюсь включить Modeshape в приложение Spring, где аутентификация уже произошла при входе в систему до подключения к репозиторию JCR. Это работает, поскольку я могу получить ссылку, используя

session = repository.login();

Однако это, похоже, обходит настраиваемого провайдера аутентификации, который я хочу использовать для управления доступом на уровне рабочей области (раздел 6.5 документации). Вот моя конфигурация:

<configuration xmlns:...>

<mode:repositories>
    <mode:repository jcr:name="my_repo" mode:source="my_source">

       <mode:authenticationProviders>
           <mode:authenticationProvider
                       jcr:name="customAuthProvider" 
                 mode:classname="com.myapp.CustomSecurityContext" /> 
       </mode:authenticationProviders>

   </mode:repository>
</mode:repositories>

<mode:sources jcr:primaryType="nt:unstructured">
     <mode:source jcr:name="my_source" ....
     </mode:sources>
</configuration>

CustomSecurityContext никогда не создается (есть аннотации spring, но конструктор (POJO) никогда не вызывается. Есть идеи, что может быть не так?

@Configurable (preConstruction = true)
public class CustomSecurityContext implements SecurityContext, AuthorizationProvider {

    @Autowired
    private ServletCredentials servletCredentials;

    @Autowired
    CustomUserDetailsManager userDetailsManager;

    @Autowired
    WorkspaceRole workspaceRole;

    private static final Logger log = LogUtil.getLogger();

    public CustomSecurityContext () {
        System.out.println(" ******** THIS NEVER GETS CALLED ********");
    }

    @Override
    public String getUserName() {
        HttpServletRequest request = servletCredentials.getRequest();

        if (request != null) {
            return request.getUserPrincipal().getName();
        }

        log.warn("HttpServletRequest is null, defaulting to getUserName() = null");
        return null;
    }

    @Override
    public boolean hasRole(String roleName) {

        int idUser = userDetailsManager.getIdUser();

        if (idUser == userDetailsManager.getSystemUserID()) {
            // The system itself can work with all workspaces
            return true;
        }

        if (roleName == null) {
            log.warn("roleName is null when calling hasRole, returning false");
            return false;
        }

        return workspaceRole.hasRole(idUser, roleName);
    }

    @Override
    public void logout() {
        log.debug("Calling logout"); // Not applicable as the session credentials are managed by Spring.

    }

    @Override
    public boolean hasPermission(ExecutionContext context, String repositoryName, String repositorySourceName, String workspaceName, Path path, String... actions) {

        log.info("Checking hasPermission for repository '" + repositoryName + "', workspace '" + workspaceName + ", path: '" + path);

        if (actions != null) {
            for (String action : actions) {
                log.info("Action : " + action);
            }
        }
        return true;  // TODO:...
    }
}

person user1016765    schedule 26.03.2012    source источник


Ответы (1)


Я запустил вашу конфигурацию (или, по крайней мере, эту конфигурацию в наших тестовых примерах с фрагментом <mode:authenticationProviders>) и отладил код (версия 2.8.0.Final) и увидел, что ModeShape действительно пытается создать экземпляр класса. Если по какой-либо причине создание экземпляра не удается (код буквально пытается перехватить все Throwables), то ModeShape запишет в журнал сообщение об ошибке:

Unable to initialize authentication provider "com.myapp.CustomSecurityContext" for repository "my_repo": <whatever the reason is>

Разве ты не видишь этого? Если нет, проверьте правильность записи журналов. Кроме того, не стесняйтесь обращаться к нам на наших дискуссионных форумах, чтобы получить помощь.

person Randall Hauch    schedule 26.03.2012
comment
Не вижу этого сообщения вообще - переключаюсь на обсуждение модшейпа, чтобы продолжить тему... - person user1016765; 26.03.2012