Thymeleaf - Получение полного имени аутентифицированного пользователя - PullRequest
1 голос
/ 19 февраля 2020

В соответствии с настройками безопасности thymeleaf страница Я могу получить зарегистрированное имя пользователя и роли, как показано ниже:

Logged user: <span sec:authentication="name">Bob</span>
Roles: <span sec:authentication="principal.authorities">[ROLE_USER, ROLE_ADMIN]</span>

У меня есть веб-приложение, в котором аутентификация выполняется через активный каталог с использованием ActiveDirectoryLdapAuthenticationProvider как показано ниже:

@Bean
@Override
public AuthenticationManager authenticationManager() {
    return new ProviderManager(Arrays.asList(activeDirectoryLdapAuthenticationProvider()));
}

@Bean
public AuthenticationProvider activeDirectoryLdapAuthenticationProvider() {
    ActiveDirectoryLdapAuthenticationProvider provider = new ActiveDirectoryLdapAuthenticationProvider(adDomain,
            adUrl);
    provider.setConvertSubErrorCodesToExceptions(true);
    provider.setUseAuthenticationRequestCredentials(true);  

    return provider;
}

Затем, после того как пользователь вошел в систему, у меня есть страница заголовка, которую я использую на всех своих страницах с указанным выше тегом sec:authentication="name" thymeleaf, чтобы показать имя пользователя, но я хотел посмотреть, есть ли вместо этого можно показать полное имя.

Предлагаемое решение здесь у меня не работает:

Я использую: thymeleaf-extras-springsecurity5

и используя: <span th:text ="${#authentication.getPrincipal().getUser().getFirstName()}"></span>

Дает мне: Method getUser() cannot be found on type org.springframework.security.ldap.userdetails.LdapUserDetailsImpl

Кажется, эта информация взята из: org.springframework.security.ldap.userdetails.LdapUserDetailsImpl, и есть только несколько вариантов, таких как имя пользователя, но не остальная часть информации, которую может иметь AD.

1 Ответ

0 голосов
/ 19 февраля 2020

Вот как я решил свою проблему:

Первый

Я добавил поставщику UserDetailsContextMapper с org.springframework.security.ldap.userdetails.InetOrgPersonContextMapper, как показано ниже:

@Bean
public AuthenticationProvider activeDirectoryLdapAuthenticationProvider() {
  ActiveDirectoryLdapAuthenticationProvider provider = new ActiveDirectoryLdapAuthenticationProvider(adDomain, adUrl);
  provider.setConvertSubErrorCodesToExceptions(true);
  provider.setUseAuthenticationRequestCredentials(true);          
  provider.setUserDetailsContextMapper(userDetailsContextMapper());  <---

  return provider;
}

@Bean
public UserDetailsContextMapper userDetailsContextMapper() {
  return new LdapUserDetailsMapper() {
      @Override
      public UserDetails mapUserFromContext(DirContextOperations ctx, String username, Collection<? extends GrantedAuthority> authorities) {
          InetOrgPersonContextMapper personContextMapper = new InetOrgPersonContextMapper();
          return personContextMapper.mapUserFromContext(ctx, username, authorities);                  
      }           
  };
}

Второй

Затем на своей странице заголовка я добавил:

<span th:text ="${#authentication.getPrincipal().getDisplayName()}"></span>

Для отображения полного имени.

При таком подходе у вас также есть доступ, чтобы показать все другие связанные с AD поля, такие как:

<span th:text ="${#authentication.getPrincipal().getMail()}"></span>
<span th:text ="${#authentication.getPrincipal().getTelephoneNumber()}"></span>
<span th:text ="${#authentication.getPrincipal().getRoomNumber()}"></span>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...