Я бы хотел добавить систему ролей в мое приложение весенней загрузки.На данный момент я использую страницу 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;
}
}