приложение весенней загрузки по группам ldap - PullRequest
0 голосов
/ 24 января 2019

Я использую аутентификацию ldap для обеспечения безопасности при загрузке приложения. Я хочу авторизовать конечные точки для определенных групп серверов ldap. Есть предложения?

Вот мой файл SecurityConfig.java.

@Override
protected void configure(HttpSecurity http) throws Exception {


    http
            .csrf().disable()
            .authorizeRequests()
            .antMatchers("/403","/login","/footer").permitAll()
            .antMatchers("/","/LifeForm**","/home").fullyAuthenticated()
            //.anyRequest().authenticated()
            .and()
            //.httpBasic()
            //.and()
            .formLogin()
            .loginPage("/login").failureUrl("/403").permitAll()
            .and()
            .logout().logoutUrl("/403").invalidateHttpSession(true).deleteCookies("JSESSIONID").logoutSuccessUrl("/login");
}

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {

    if(Boolean.parseBoolean(ldapEnabled)) {

        auth
                .ldapAuthentication()
                .userSearchFilter("(&(objectClass=user)(sAMAccountName={0}))")
                .groupRoleAttribute("cn")
                .groupSearchFilter("(&(objectClass=groupOfNames)(member={0}))")
                .groupSearchBase("ou=groups")
                .contextSource()
                .url(ldapUrls + ldapBaseDn)
                .managerDn(ldapSecurityPrincipal)
                .managerPassword(ldapPrincipalPassword);

    } else {
        auth
                .inMemoryAuthentication()
                .withUser("user").password("password").roles("USER")
                .and()
                .withUser("admin").password("admin").roles("ADMIN");
    }
}

1 Ответ

0 голосов
/ 24 января 2019

Попробуйте добавить «antMatcher», который проверяет один авторитет в Ldap.

Например:

.antMatchers("/admins").hasAuthority("GROUP-SPAIN")

У меня есть эта конфигурация в моем приложении

 @Override
    public void configure(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
                .authorizeRequests()
                //.antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
                // allow anonymous resource requests
                .antMatchers(
                        HttpMethod.GET,
                        "/",
                        "/v2/api-docs",           // swagger
                        "/webjars/**",            // swagger-ui webjars
                        "/swagger-resources/**",  // swagger-ui resources
                        "/configuration/**",      // swagger configuration
                        "/*.html",
                        "/favicon.ico",
                        "/**/*.html",
                        "/**/*.css",
                        "/**/*.js"
                ).permitAll()
                .antMatchers("/auth/**").permitAll()
                .antMatchers("/management/**/*", "/management/*.json").hasAuthority("ADMIN")
                .antMatchers("/admins").hasAuthority("GROUP-SPAIN"")
                .anyRequest().authenticated();
    }

Вам необходимо создать класс UserDetailsService для добавления необходимых вам полномочий вместо группы пользователей. В этом примере я использую базу данных в качестве примера, вам нужно изменить мой userDao для вашего соединения ldap.

    @Component
public class TodoListUserDetailsService implements UserDetailsService {

    @Autowired
    private UserDao userDao; //Change for ldap conection

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        //Get the user from ldap.
        AppUser user = userDao.findByUsername(username);

        if (null == user) {
            throw new UsernameNotFoundException(String.format("Username {0} doesn't exist", username));
        }

        List<GrantedAuthority> authorities = new ArrayList<>();

        //this part is pseudocode
        user.getGroups().forEach(ldapGroup -> {
            authorities.add(new SimpleGrantedAuthority(ldapGroup.toString()));
        });

        UserDetails userDetails = new User(user.getUsername(), user.getPassword(), authorities);

        return userDetails;
    }
}

Spring будет использовать ваш UserDetailsService, когда пользователь попытается получить доступ к приложению.

...