[SPRING] Spring 보안 3.0.2로 OpenId 인증 및 자동 등록
SPRINGSpring 보안 3.0.2로 OpenId 인증 및 자동 등록
오픈 아이디 로그인과 등록으로 스프링 보안 3.0.2를 사용하는 앱을 구현하고 있습니다. 성공적으로 로그인 할 수 있지만 사용자가 등록되지 않은 경우 수행 할 작업 :
1) 이메일 및 이름과 같은 일부 OpenId 속성을 가져옵니다. 2)이 두 필드와 OpenId URI가 채워진 등록 양식을 사용자에게 보여줍니다.
나는 많은 것을 찾고 있었지만 나는 이것을하는 "우아한"방법을 찾지 못했다. 내 앱에서이 전략을 구현할 수있는 솔루션이 있는지 궁금하다.
미리 감사드립니다.
해결법
-
==============================
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.이것은 스프링 보안 <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
from https://stackoverflow.com/questions/2724123/openid-authentication-and-automatic-registration-with-spring-security-3-0-2 by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 스프링 빈을 다시 초기화하는 방법은? (0) | 2019.03.29 |
---|---|
[SPRING] Spring의 CachingConnectionFactory를 사용할 때 세션 닫기 (0) | 2019.03.29 |
[SPRING] 스프링 보안에서 커스텀 UserDetail 객체를 생성하는 방법 (0) | 2019.03.29 |
[SPRING] DataSourceUtils.getConnection 대 DataSource.getConnection (0) | 2019.03.29 |
[SPRING] <constructor-arg>를 Spring Annotation으로 대체한다. (0) | 2019.03.28 |