복붙노트

[SPRING] LDAP 및 데이터베이스 역할을 가진 Spring 보안

SPRING

LDAP 및 데이터베이스 역할을 가진 Spring 보안

새로운 보험 프로젝트에서 Ldap active-directory로 스프링 보안을 구현하려고합니다.

나는 사용자가 AD에서 찾으면 AD에 대한 사용자 이름 / 암호를 확인하려고합니다. 사용자 테이블 (앱 권한이 부여 된 사용자)에게 데이터베이스의 액세스 수준을 부여하고 싶습니다. 누군가가 샘플을 줄 수 있었는지 / 좋은 자원에 대한 저를 지적 할 수 있었습니까?

해결법

  1. ==============================

    1.지금 이것을 달성하는 가장 쉬운 방법은 (Spring Security 3.2.5.RELEASE) 사용자 정의 JdbcDaoImpl을 사용하여 데이터베이스에서 권한을 얻는 사용자 정의 LdapAuthoritiesPopulator를 구현하는 것입니다.

    지금 이것을 달성하는 가장 쉬운 방법은 (Spring Security 3.2.5.RELEASE) 사용자 정의 JdbcDaoImpl을 사용하여 데이터베이스에서 권한을 얻는 사용자 정의 LdapAuthoritiesPopulator를 구현하는 것입니다.

    기본 데이터베이스 스키마를 사용 중이고 LDAP의 인증 및 권한 테이블의 외래 키와 동일한 사용자 이름을 사용한다고 가정하면 다음과 같이하면됩니다.

    package demo;
    
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.Collection;
    import java.util.List;
    
    import org.springframework.jdbc.core.RowMapper;
    import org.springframework.security.core.GrantedAuthority;
    import org.springframework.security.core.authority.AuthorityUtils;
    import org.springframework.security.core.authority.SimpleGrantedAuthority;
    import org.springframework.security.core.userdetails.User;
    import org.springframework.security.core.userdetails.UserDetails;
    import org.springframework.security.core.userdetails.UsernameNotFoundException;
    import org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl;
    
    import org.springframework.ldap.core.DirContextOperations;
    import org.springframework.security.core.GrantedAuthority;
    import org.springframework.security.ldap.userdetails.LdapAuthoritiesPopulator;
    
    /*
     * You need to extend JdbcDaoImpl to expose the protected method loadUserAuthorities.
     */
    public class CustomJdbcUserDetailsService extends JdbcDaoImpl {
    
        @Override
        public List<GrantedAuthority> loadUserAuthorities(String username) {
            return super.loadUserAuthorities(username);
        }
    }
    
    
    /*
     * Then, the only thing your populator needs to do is use the custom UserDetailsService above.
     */
    public class CustomLdapAuthoritiesPopulator implements LdapAuthoritiesPopulator {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(CustomLdapAuthoritiesPopulator.class);
    
        private CustomJdbcUserDetailsService service;
    
        public CustomLdapAuthoritiesPopulator(CustomJdbcUserDetailsService service) {
            this.service = service;
        }
    
        public Collection<? extends GrantedAuthority> getGrantedAuthorities(DirContextOperations user, String username) {
            return service.loadUserAuthorities(username);
        }
    
    }
    

    이제는 CustomLdapAuthoritiesPopulator를 사용하도록 LDAP 인증 공급자를 구성해야합니다.

    GlobalMethodSecurityConfiguration 또는 WebSecurityConfigurerAdapter의 @Configuration 주석이 첨부 된 하위 클래스 (경우에 따라 다름)에 다음을 추가하십시오.

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    
        /* other authentication configurations you might have */
    
        /*
         * This assumes that the dataSource configuring
         * the connection to the database has been Autowired
         * into this bean.
         *
         * Adapt according to your specific case.
         */
        CustomJdbcUserDetailsService customJdbcUserDetailsService = new CustomJdbcUserDetailsService();
        customJdbcUserDetailsService.setDataSource(dataSource);
    
        CustomLdapAuthoritiesPopulator customLdapAuthoritiesPopulator = new CustomLdapAuthoritiesPopulator(customJdbcUserDetailsService);
    
        auth.ldapAuthentication().ldapAuthoritiesPopulator(customLdapAuthoritiesPopulator)/* other LDAP configurations you might have */;
    
        /* yet more authentication configurations you might have */
    }
    

    작동 예제는 https://github.com/pfac/howto-spring-security를 ​​참조하십시오.

    면책 조항 : 저는 Java 구성만으로 작업 했으므로 조심스럽게 진행하면서 오류가있을 수 있습니다.

    LDAP로 인증하는 다른 구성과 달리 LdapAuthoritiesPopulator를 사용자 정의 할 수있는 예쁜 XML 태그가없는 것 같습니다. 따라서 수동으로 수행해야합니다. LDAP 서버에 대한 연결을 설정하는 bean contextSource가 정의되었다고 가정하면 Spring XML 설정에 다음을 추가한다.

    <beans:bean id="customJdbcUserDetailsService" class="demo.CustomJdbcUserDetailsService" />
    <beans:bean id="customLdapAuthoritiesPopulator" class="demo.CustomLdapAuthoritiesPopulator">
        <beans:constructor-arg ref="customJdbcUserDetailsService" />
    </beans:bean>
    
    <beans:bean id="ldapAuthProvider" class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider">
        <beans:constructor-arg>
            <beans:bean class="org.springframework.security.ldap.authentication.BindAuthenticator">
                <beans:constructor-arg ref="contextSource" />
                <!--
                    other configurations you might need
                -->
            </beans:bean>
        </beans:constructor-arg>
        <beans:constructor-arg ref="customLdapAuthoritiesPopulator" />
    </beans:bean>
    
    <security:authentication-manager>
      <security:authentication-provider ref="ldapAuthProvider" />
    </security:authentication-manager>
    

    출처 : http://spapas.github.io/2013/10/14/spring-ldap-custom-authorities/#spring-security-ldap-with-custom-authorities

  2. ==============================

    2.LDAP를 통한 인증이지만 DB 쿼리를 통해 역할을 얻는 것이므로 사용자 정의 UserDetailsServer를 수행해야 할 가능성이 큽니다. UserDetailsService는 인터페이스입니다. 인터페이스를 구현 한 다음 스프링 보안 설정에 사용자 정의 구현을 추가하여 다음과 같은 작업을 수행 할 수 있습니다.

    LDAP를 통한 인증이지만 DB 쿼리를 통해 역할을 얻는 것이므로 사용자 정의 UserDetailsServer를 수행해야 할 가능성이 큽니다. UserDetailsService는 인터페이스입니다. 인터페이스를 구현 한 다음 스프링 보안 설정에 사용자 정의 구현을 추가하여 다음과 같은 작업을 수행 할 수 있습니다.

    <beans:bean id="userDetailsService" class="com.app.MyUserDetailsServiceImpl" />
    
    <authentication-manager>
      <authentication-provider user-service-ref="userDetailsService">
        <password-encoder hash="plaintext" />
      </authentication-provider>
    </authentication-manager>
    

    loadUserByUsername ()에서 UserDetails를 만들고 사용자 이름, 암호 및 "authority"역할을 설정합니다.

    이 Blog Post에는 데이터베이스를 사용하여 데이터베이스를 수행하는 방법에 대한 예제가 있습니다.이 데이터베이스는 요구 사항에 맞춰야합니다.

  3. from https://stackoverflow.com/questions/16697925/spring-security-with-ldap-and-database-roles by cc-by-sa and MIT license