Как правильно добавить роли для аутентификации Spring Boot с LDAP? - PullRequest
0 голосов
/ 27 декабря 2018

Я бы хотел добавить систему ролей в мое приложение весенней загрузки.На данный момент я использую страницу spring-boot-security-starter -login по умолчанию и просто добавил LDAP-Authentication для аутентификации входа в систему.Теперь роли должны прийти из моей базы данных.Я хотел бы использовать следующую настройку:

CREATE TABLE IF NOT EXISTS MY_SYSTEMROLE (
    ID int PRIMARY KEY AUTO_INCREMENT,
    NAME varchar(255) NOT NULL,
    CONSTRAINT UC_SYSTEMROLENAME UNIQUE (NAME)
);
CREATE TABLE IF NOT EXISTS MY_USER (
    SAP_PERSONAL_ID int(32) PRIMARY KEY AUTO_INCREMENT,
    LASTNAME varchar(255),
    FIRSTNAME varchar(255),
    SHORTHAND varchar(128) NOT NULL,
    SYSTEMROLE_ID int,
    FOREIGN KEY (SYSTEMROLE_ID) REFERENCES MY_SYSTEMROLE(ID)
);

Теперь пользователь проходит аутентификацию через AD с атрибутом MY_USER.SHORTHAND.

INSERT INTO MY_SYSTEMROLE (NAME) VALUES ('ADMIN'); #ID 1
INSERT INTO MY_SYSTEMROLE (NAME) VALUES ('USER'); #ID 2

INSERT INTO MY_USER (LASTNAME, FIRSTNAME, SHORTHAND) VALUES ('Boo', 'Hoo', 'FOO', '2'); #Role: USER

Поэтому я попытался настроить dashboard с таким списком:

<ul>
  <li><a routerLinkActivate="active" routerLink="/adminView">AdminView</a></li>
  <li><a (click)="logout()">Logout</a></li>
</ul>

И только пользователи с ролью ADMIN должны иметь доступ к AdminView,Теперь я узнал, что могу использовать authentication.getAuthorities() для получения Authorities (очевидно).Это означает, что я мог бы установить контроллер, который возвращает роль для вошедшего в систему пользователя во внешний интерфейс.

И все же, как правильно добавить ROLE к властям?Я мог бы - когда пользователь успешно аутентифицирован (так перенаправлен на панель мониторинга) сделать API-вызов из внешнего интерфейса в серверный и запросить роли из базы данных и назначить их, но это не совсем похоже на «чистую» идею илиХорошая практика.

Моя LDAP-аутентификация:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Value("${ad.domain}")
    private String AD_DOMAIN;

    @Value("${ad.url}")
    private String AD_URL;

    private final Logger logger = LoggerFactory.getLogger(WebSecurityConfig.class);

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().fullyAuthenticated().and().formLogin().and().httpBasic();
        http.formLogin().defaultSuccessUrl("/", true);
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(activeDirectoryLdapAuthenticationProvider());
    }

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

    @Bean
    public AuthenticationProvider activeDirectoryLdapAuthenticationProvider() {
        ActiveDirectoryLdapAuthenticationProvider provider = new ActiveDirectoryLdapAuthenticationProvider(AD_DOMAIN,
                AD_URL);
        provider.setConvertSubErrorCodesToExceptions(true);
        provider.setUseAuthenticationRequestCredentials(true);
        return provider;
    }
}
...