0

Я пытаюсь назначить роли пользователю, успешно зарегистрировавшемуся в веб-приложении Spring. Для этого я использую аутентификацию LDAP.Как назначить роли на основе имени группы при входе пользователя в систему безопасности Spring

Мой WebSecurityConfig.java

package com.logsniffer.web.util; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; 
import org.springframework.security.config.annotation.web.builders.HttpSecurity; 
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; 
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 
import org.springframework.security.ldap.authentication.ad.ActiveDirectoryLdapAuthenticationProvider; 
import org.springframework.context.annotation.Bean; 
import org.apache.log4j.Logger; 
import org.springframework.security.core.Authentication; 
import org.springframework.core.env.Environment; 
import org.springframework.security.ldap.DefaultSpringSecurityContextSource; 
import org.springframework.security.core.context.SecurityContextHolder; 

@Configuration 
@EnableWebSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    Environment env; 

    @Autowired 
    public void registerGlobalAuthentication(AuthenticationManagerBuilder auth) 
      throws Exception 
    { 
     if ("h2".equals(env.getProperty("spring.profiles.active"))) 
      return; 

     DefaultSpringSecurityContextSource context = new DefaultSpringSecurityContextSource("ldap://10.100.7.99:389/dc=ldap,dc=com"); 
     context.afterPropertiesSet(); 

     auth.ldapAuthentication() 
       .contextSource(context) 
       .userSearchFilter("uid={0}") 
       .userSearchBase("ou=support") 
     //   .groupSearchBase("ou=support") 
     //   .groupSearchFilter(String groupSearchFilter) 
       .groupRoleAttribute("cn") 
       .rolePrefix(""); 


    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
       .csrf().disable() 
       .authorizeRequests() 
//    .antMatchers("/", "/home").permitAll() 
       .anyRequest() 
       .authenticated() 
       .and() 
       .formLogin() 
       .permitAll(); 
     } 
} 

Может быть, я понять это неправильно. Я думал, используя

.groupRoleAttribute("cn") 

устанавливает роль пользователя. Но когда я пытаюсь напечатать пользовательские полномочия, например:

Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 
String r= authentication.getAuthorities().toString(); 
log.info("$$$$$$$$$$ " + r); 

Я получаю пустую строку. Мой LDAP дерево имеет следующую конфигурацию

+--> dc=ldap,dc=com (1+) 
---> cn=admin 
---> ou=hr 
+--> ou=support (1+) 
| +--> cn=admin (2) 
| | ---> cn=kaushan deva 
| | ---> cn=sameera ramasinghe 
| | ---> Create new entry here 
| +--> cn=regular (1) 
| | ---> cn=chamitha abe 

Я являюсь prettry уверен в registerGlobalAuthentication методы, как я пытаюсь для проверки подлинности пользователей является неправильным. Вот почему я не могу установить атрибуты роли группы. Но я не могу найти ошибку, так как я очень новичок в этом.

Что я хочу сделать, так это установить роли пользователей для каждого пользователя, который входит в систему, исходя из своей группы (admin или regular).

+0

Да, это ноль. Спасибо за ссылку. Я пройду через это. Между тем, если бы вы могли дать некоторое понимание этого вопроса, это было бы здорово – SameeraR

ответ

-2

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

@Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
      .formLogin() 
       .loginProcessingUrl("/app/url") 
       .usernameParameter("j_username") 
       .passwordParameter("j_password") 
       .successHandler(loginSuccessHandler) 
       .failureHandler(loginFailureHandler) 
       .permitAll() 
       .and() 
      .logout() 
       .logoutUrl("/app/logout") 
       .logoutSuccessHandler(ajaxLogoutSuccessHandler) 
       .deleteCookies("JSESSIONID") 
       .permitAll() 
       .and() 
      .csrf() 
       .disable() 
      .authorizeRequests() 
       .antMatchers("/resources/**").permitAll() 
       .antMatchers("/api/**").authenticated(); 
    } 

Войти Успех Handler:

@Component 
public class LoginSuccessHandler extends SimpleUrlAuthenticationSuccessHandler { 

    @Override 
    public void onAuthenticationSuccess(HttpServletRequest request, 
      HttpServletResponse response, Authentication authentication) 
      throws IOException, ServletException { 
     User user =  (User)authentication.getPrincipal(); 
     String name = user.getUsername(); 
     //Your Code based on code and set role in Spring Security 
     response.setStatus(HttpServletResponse.SC_OK); 

    } 
} 
-1

Второй путь вы можете сделать, как это с ApplicationDetailService:

@Autowired 
    public void configureGlobal(AuthenticationManagerBuilder auth) 
      throws Exception { 
     auth.userDetailsService(userDetailsService).passwordEncoder(encryptDecrypt); 
    } 

ApplicatonDetailService:

@Service("userDetailsService") 
public class ApplicationUserDetailsService implements UserDetailsService { 

    @Transactional(readOnly = true) 
    public UserDetails loadUserByUsername(final String username) 
      throws UsernameNotFoundException { 

     com.your.User domainUser = userDAO.findByEmail(username); 

     List<GrantedAuthority> authList = getGrantedAuthorities(new SimpleGrantedAuthority("ROLE_ADMIN")); 
     return new User(domainUser.getEmail(), domainUser.getPassword(), 
      enabled, accountNonExpired, credentialsNonExpired, 
      accountNonLocked, authList); 

    } 
} 

Вы можете установить на основе Роль на Конди :

List<GrantedAuthority> authList = getGrantedAuthorities(new SimpleGrantedAuthority("ROLE_ADMIN"));