복붙노트

[SPRING] 스프링 보안 3.1을 사용하여 활성 디렉토리에 인증 될 때 역할 처리

SPRING

스프링 보안 3.1을 사용하여 활성 디렉토리에 인증 될 때 역할 처리

Spring Security 3.1을 사용하여 Active Directory와 인증을 사용하려고합니다. 나는 인증을 받고 모든 것이 잘된다.

<sec:ldap-server id="ldapServer" url="ldap://ldap/dc=sub,dc=domain,dc=com" port="389" />

<sec:authentication-manager erase-credentials="true"  >
    <sec:authentication-provider ref="ldapActiveDirectoryAuthProvider" />
</sec:authentication-manager>

<bean id="ldapActiveDirectoryAuthProvider" 
        class="org.springframework.security.ldap.authentication.ad.ActiveDirectoryLdapAuthenticationProvider">
    <constructor-arg value="domain" />
    <constructor-arg value="ldap://server:389/"/> 
</bean>

질문에. 필터를 설정할 수 있도록 사용자 역할을 어떻게 처리합니까?

예 :

<sec:intercept-url pattern="/**" access="ROLE_USER"/>

UserDetailContextMapper를 사용하여 내 광고 그룹을 ROLE_USER, ROLE_ADMIN 등에 매핑하여이 작업을 수행하는 방법을 알았습니다.

    <bean id="ldapActiveDirectoryAuthProvider" 
        class="org.springframework.security.ldap.authentication.ad.ActiveDirectoryLdapAuthenticationProvider">
    <constructor-arg value="domain" />
    <constructor-arg value="ldap://host:389/"/> 
    <property name="userDetailsContextMapper" ref="tdrUserDetailsContextMapper"/>
    <property name="useAuthenticationRequestCredentials" value="true"/>
</bean>

<bean id="tdrUserDetailsContextMapper" class="com.bla.bla.UserDetailsContextMapperImpl"/>

매퍼 클래스 :

public class UserDetailsContextMapperImpl implements UserDetailsContextMapper, Serializable{
    private static final long serialVersionUID = 3962976258168853954L;

    @Override
    public UserDetails mapUserFromContext(DirContextOperations ctx, String username, Collection<? extends GrantedAuthority> authority) {

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


        for (GrantedAuthority granted : authority) {

            if (granted.getAuthority().equalsIgnoreCase("MY USER GROUP")) {
                mappedAuthorities.add(new GrantedAuthority(){
                    private static final long serialVersionUID = 4356967414267942910L;

                    @Override
                    public String getAuthority() {
                        return "ROLE_USER";
                    } 

                });
            } else if(granted.getAuthority().equalsIgnoreCase("MY ADMIN GROUP")) {
                mappedAuthorities.add(new GrantedAuthority() {
                    private static final long serialVersionUID = -5167156646226168080L;

                    @Override
                    public String getAuthority() {
                        return "ROLE_ADMIN";
                    }
                });
            }
        }
        return new User(username, "", true, true, true, true, mappedAuthorities);
    }

    @Override
    public void mapUserToContext(UserDetails arg0, DirContextAdapter arg1) {
    }
}

해결법

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

    1.beans.xml의 역할은 memberOf value 속성의 CN (공통 이름)과 정확히 일치해야합니다. 디렉토리 기본 사항에 대한 자습서를 읽어야합니다.

    beans.xml의 역할은 memberOf value 속성의 CN (공통 이름)과 정확히 일치해야합니다. 디렉토리 기본 사항에 대한 자습서를 읽어야합니다.

    이 사용자가 있다고 해봅시다. CN = Michael-O, OU = 사용자, OU = 부서, DC = 하위, DC = 회사, DC = net 이 컨텍스트에서이 memberOf 값 CN = 그룹 이름, OU = 사용 권한, OU = 그룹, OU = 부서, DC = 하위, DC = 회사, DC = net

    Bean은이 memberOf 값을 찾고 그룹 이름을 추출합니다. beans.xml은 정확히이 값을 가져야한다.

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

    2.또한 3.1에서 소개 된 GrantedAuthoritiesMapper를 권한 수정을위한 일반적인 전략으로 삽입 할 수 있습니다. 또한 GrantedAuthority 구현에 SimpleGrantedAuthority를 ​​사용할 수도 있습니다. 또는 고정 된 값 집합을 가지고 있으므로 열거 형을 사용할 수 있습니다.

    또한 3.1에서 소개 된 GrantedAuthoritiesMapper를 권한 수정을위한 일반적인 전략으로 삽입 할 수 있습니다. 또한 GrantedAuthority 구현에 SimpleGrantedAuthority를 ​​사용할 수도 있습니다. 또는 고정 된 값 집합을 가지고 있으므로 열거 형을 사용할 수 있습니다.

    enum MyAuthority implements GrantedAuthority {
        ROLE_ADMIN,
        ROLE_USER;
    
        public String getAuthority() {
            return name();
        }
    }
    
    
    class MyAuthoritiesMapper implements GrantedAuthoritiesMapper {
    
        public Collection<? extends GrantedAuthority> mapAuthorities(Collection<? extends GrantedAuthority> authorities) {
            Set<MyAuthority> roles = EnumSet.noneOf(MyAuthority.class);
    
            for (GrantedAuthority a: authorities) {
                if ("MY ADMIN GROUP".equals(a.getAuthority())) {
                    roles.add(MyAuthority.ROLE_ADMIN);
                } else if ("MY USER GROUP".equals(a.getAuthority())) {
                    roles.add(MyAuthority.ROLE_USER);
                }
            }
    
            return roles;
        }
    }
    
  3. from https://stackoverflow.com/questions/8835818/handling-roles-when-authenticated-to-active-directory-with-spring-security-3-1 by cc-by-sa and MIT license