使用LDAP向身份验证Spring Boot添加角色的正确方法是什么

时间:2018-12-27 11:38:07

标签: spring spring-boot authorization

我想在我的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;
    }
}

0 个答案:

没有答案