我想在我的spring-boot应用程序中添加一个角色系统。目前,我使用默认的spring-boot-security-starter
登录页面,并简单地添加了一个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;
}
}