복붙노트

[SPRING] Spring 보안 3.0.2로 OpenId 인증 및 자동 등록

SPRING

Spring 보안 3.0.2로 OpenId 인증 및 자동 등록

오픈 아이디 로그인과 등록으로 스프링 보안 3.0.2를 사용하는 앱을 구현하고 있습니다. 성공적으로 로그인 할 수 있지만 사용자가 등록되지 않은 경우 수행 할 작업 :

1) 이메일 및 이름과 같은 일부 OpenId 속성을 가져옵니다. 2)이 두 필드와 OpenId URI가 채워진 등록 양식을 사용자에게 보여줍니다.

나는 많은 것을 찾고 있었지만 나는 이것을하는 "우아한"방법을 찾지 못했다. 내 앱에서이 전략을 구현할 수있는 솔루션이 있는지 궁금하다.

미리 감사드립니다.

해결법

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

    1.사용자가 등록 / 로그인하기 전에 이메일과 이름을 표시 할 수 없습니다. 먼저 앱이 자신의 프로필에 액세스하도록 허용해야하기 때문입니다. 로그인 한 후 openid, mail 등으로이 페이지를 보여줄 수 있습니다.

    사용자가 등록 / 로그인하기 전에 이메일과 이름을 표시 할 수 없습니다. 먼저 앱이 자신의 프로필에 액세스하도록 허용해야하기 때문입니다. 로그인 한 후 openid, mail 등으로이 페이지를 보여줄 수 있습니다.

    사용할 속성을 정의하십시오.

    <openid-login login-page="/openidlogin.jsp" authentication-failure-url="/openidlogin.jsp?login_error=true">
      <attribute-exchange>
        <openid-attribute name="email" type="http://schema.openid.net/contact/email" required="true" count="2"/>
        <openid-attribute name="name" type="http://schema.openid.net/namePerson/friendly" />
      </attribute-exchange>
    </openid-login>
    

    그리고 사용자가 로그인 한 후에 속성에 액세스하십시오.

    OpenIDAuthenticationToken token = (OpenIDAuthenticationToken)SecurityContextHolder.getContext().getAuthentication();
    List<OpenIDAttribute> attributes = token.getAttributes();
    

    스프링 저장소의 예제와 OpenId 지원 문서를 살펴보십시오.

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

    2.이것은 스프링 보안 <3.1에 구현되지 않았다.

    이것은 스프링 보안 <3.1에 구현되지 않았다.

    그러나 apectJ에 대한 대안을 사용할 수 있습니다. 다음 측면을 정의하십시오.

    package org.acoveo.spring.utils;
    @Aspect
    public class OpenIDSpringAuthenticationHackAspect {
        static ThreadLocal<Authentication> authHolder = new ThreadLocal<Authentication>();
        @Around(value="execution(* org.springframework.security.openid.OpenIDAuthenticationProvider.authenticate(..))")
        public Object around(ProceedingJoinPoint jp) throws Throwable {
            try {
                Authentication auth = (Authentication) jp.getArgs()[0];
                authHolder.set(auth);
                Object returnVal = jp.proceed();
                authHolder.set(null);
                return returnVal;
            }catch(Throwable e) {
                System.out.println("Exception while running OpenIDSpringAuthenticationHackAspect");
                e.printStackTrace();
                return null;
            }
        }
        public static Authentication getTransientAuthentication() {
            return authHolder.get();
        }
    }
    

    aop.xml에 등록하십시오.

    <!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">  
    <aspectj>
        <weaver options="-showWeaveInfo -verbose" />
        <weaver>
            <include within="org.springframework.security.openid..*" />
            <!-- This is required to make the spring instrument javaagent work with hibernate CGLIB
             -->
            <exclude within="*..*CGLIB*" />
        </weaver>
        <aspects>
            <aspect name="org.acoveo.spring.utils.OpenIDSpringAuthenticationHackAspect" />
        </aspects>
    </aspectj>
    

    그런 다음 UserDetailsService에서 다음과 같이 OpenID 특성에 액세스 할 수 있습니다.

    public UserDetails loadUserByUsername(String username, boolean includeTemporary) throws UsernameNotFoundException, DataAccessException {
        Authentication auth = OpenIDSpringAuthenticationHackAspect.getTransientAuthentication();
        if(auth != null && auth instanceof OpenIDAuthenticationToken) {
            // First try to find the user by their openid email address
            OpenIDAuthenticationToken openIdToken = (OpenIDAuthenticationToken)auth;
            String email = null;
            for(OpenIDAttribute attr : openIdToken.getAttributes()) {
                if("email".equals(attr.getName()) && attr.getValues() != null && !attr.getValues().isEmpty()) {
                    email = attr.getValues().get(0);
                    break;
                }
            }
            // TODO retrieve and return user
    
  3. from https://stackoverflow.com/questions/2724123/openid-authentication-and-automatic-registration-with-spring-security-3-0-2 by cc-by-sa and MIT license