복붙노트

[SPRING] 스프링 보안을 이용한 싱글 사인온 통합

SPRING

스프링 보안을 이용한 싱글 사인온 통합

저는 Spring Security를 ​​사용하고 있으며 인증 제공자 중 한 명으로 다른 사이트를 사용하고 싶습니다. 내 사이트에 기본 양식 기반 로그인이 있습니다. 내 사이트에 사용자가 로그인 할 외부 사이트로 이동하는 링크가 있고 외부 사이트에서 xml 응답을 다시 게시하여 성공적인 로그인이 있는지 확인할 수있는 데이터를 제공합니다. 어떤 도움이라도 대단히 감사하겠습니다!

아래 지침을 사용하는 예 :

필터 (내 데이터가 요청에서 xml로 표시되지 않음) :

public class XMLAuthenticationFilter extends AbstractAuthenticationProcessingFilter{

    public XMLAuthenticationFilter() {
        super("/xml_security_check");
    }

    @Override
    public Authentication attemptAuthentication(HttpServletRequest request,
            HttpServletResponse response) throws AuthenticationException,
            IOException, ServletException {

            GrantedAuthority[] grantedAuthorities = new GrantedAuthority[] { new GrantedAuthorityImpl("ROLE_USER")};
            UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken("userid", "pwd", grantedAuthorities);
            request.getSession();
            token.setDetails(new WebAuthenticationDetails(request));
            Authentication authenticatedUser = super.getAuthenticationManager().authenticate(token);
            SecurityContextHolder.getContext().setAuthentication(authenticatedUser);
            request.getSession().setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, SecurityContextHolder.getContext());
            return authenticatedUser;

}

}

인증 공급자 :

public class XMLAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider{
    private UserManager userManager;
    @Override
    protected void additionalAuthenticationChecks(UserDetails user, UsernamePasswordAuthenticationToken token) throws AuthenticationException {

    }

    @Override
    protected UserDetails retrieveUser(String userName, UsernamePasswordAuthenticationToken token) throws AuthenticationException {
        UserDetails user = userManager.getUser(userName); 
        if(user == null){
            Users newDCUser = new Users();
            newDCUser.setUserId(userName);
            newDCUser.setRawPassword((String) token.getCredentials());
            newDCUser.setFailedLoginAttempts(0);
            newDCUser.setBeginEffectiveDate(new Date());
            newDCUser.setEndEffectiveDate(getEffectiveDate());
            userManager.saveUser(newDCUser);
        }
        return userManager.loadUserByUsername(userName);
    }

    private Date getEffectiveDate(){
         Calendar calendar = Calendar.getInstance();
         calendar.add(Calendar.YEAR, 10);
         return calendar.getTime();
    }

    public UserManager getUserManager() {
        return userManager;
    }

    public void setUserManager(UserManager userManager) {
        this.userManager = userManager;
    }
}

빈 설정 :

<bean id="xmlAuthenticationFilter" class="com.dc.api.service.impl.XMLAuthenticationFilter">
        <property name="authenticationManager" ref="am" />
    </bean>
    <bean id="xmlAuthenticationProvider" class="com.dc.api.service.impl.XMLAuthenticationProvider">
        <property name="userManager" ref="userManager"/>
    </bean>

해결법

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

    1.일반적인 접근 방식은 다음과 같습니다.

    일반적인 접근 방식은 다음과 같습니다.

    1) XML 로그인을위한 AbstractAuthenticationToken을 서브 클래스 화하고, XMLAuthenticationToken이라고 부르 자.

    2) AbstractAuthenticationProcessingFilter를 서브 클래스 화하고 UsernamePasswordAuthenticationFilter 다음에 필터 체인에 추가하십시오. XML의 데이터를 기반으로 XMLAuthenticationToken을 만들어야합니다. UsernamePasswordAuthenticationFilter를 필터의 일반적인 구조에 대한 예제로 사용할 수 있습니다 (이는 보통의 Spring Security 로그인을 위해 현재 사용하고있는 필터 일 가능성이 높습니다).

    <http>
      <custom-filter after="FORM_LOGIN_FILTER" ref="xmlAuthenticationFilter"/>
    </http>
    

    필터는 UsernamePasswordFilter와 다른 filterProcessesUrl을 설정해야합니다. 이것은 외부 시스템이 XML을 게시 할 URL입니다. 예 :

    public XmlAuthenticationFilter() {
        super("/xml_security_check");
    }
    

    3) AbstractUserDetailsAuthenticationProvider를 서브 클래 싱합니다. 토큰의 정보를 기반으로 UserDetailsService에서 사용자를 조회 한 다음 인증합니다. DaoAuthenticationProvider를 예로 사용하십시오. 새 공급자를 AuthenticationManager에 등록해야합니다.

    <authentication-manager>
      <authentication-provider user-service-ref='myUserDetailsService'/>
      <authentication-provider ref="xmlAuthenticationProvider" />
    </authentication-manager>
    

    # 1에서 UsernamePasswordAuthenticationToken을 재사용 할 수 있습니다 (# 1, 좋은 "세부 사항"확장 메커니즘이 있음). # 3의 DaoAuthenticationProvider (또는 서브 클래 싱).

  2. from https://stackoverflow.com/questions/5365054/integrate-single-sign-on-using-spring-security by cc-by-sa and MIT license