Spring Security에서 Form 인증과 Request-Header 인증을 함께 사용하는 구현 예제
8741 단어 spring-security자바spring
계기
어떤 웹 어플리케이션 개발에 있어서, 이하의 2개를 동시에 실현하는 요건이 있었다.
① 로그인 화면에서 ID와 비밀번호를 입력하여 Form 인증이 가능
②HTTP 요청 헤더의 특정 속성 값으로 인증 가능
②는 기존의 외부인증시스템이 인증 성공시 HTTP 요청 헤더에 토큰을 설정하여 리디렉션하기 때문에 그것을 이용한 SSO를 실현한다는 요건.
① 단독, 또는 ② 단독의 실장 샘플은 인터넷의 곳곳에서 볼 수 있지만, 병용하는 패턴은 보이지 않았다(그리고 나름대로 기술이었다) 때문에, 어떻게 실현했는지를 소개한다.
출처
다음과 같이 설정한다.
htps : // 기주 b. 이 m/짱 dy가 fぉゔぇr/사 mpぇ001/bぉb/마s r/src/마이/레소 rs/sp 린g せくりty. xml
해설
'PRE_AUTH_FILTER'와 'FORM_LOGIN_FILER'의 두 가지를 맞춤설정합니다.
<sec:custom-filter position="PRE_AUTH_FILTER" ref="siteminderFilter" />
<sec:custom-filter position="FORM_LOGIN_FILTER" ref="formLoginFilter" />
PRE_AUTH_FILTER 맞춤설정
「PRE_AUTH_FILTER」의 커스터마이즈는 이하와 같이 RequestHeaderAuthenticationFilter 클래스를 이용한다. Form 인증과 함께 사용할 때 exceptionIfHeaderMissing 속성을 false로, continueFilterChainOnUnsuccessfulAuthentication 속성을 true로 설정합니다.
<bean id="siteminderFilter" class="org.springframework.security.web.authentication.preauth.RequestHeaderAuthenticationFilter">
<property name="principalRequestHeader" value="SM_USER"/>
<property name="authenticationManager" ref="sm_authenticationManager" />
<property name="exceptionIfHeaderMissing" value="false"/>
<property name="continueFilterChainOnUnsuccessfulAuthentication" value="true"/>
</bean>
여기서, AuthenticationManager(와 AuthenticationProvider)는 이하와 같이 정의한다.
<sec:authentication-manager id="sm_authenticationManager">
<sec:authentication-provider ref="preauthAuthProvider" />
</sec:authentication-manager>
<bean id="preauthAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
<property name="preAuthenticatedUserDetailsService">
<bean id="userDetailsServiceWrapper"
class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper">
<property name="userDetailsService" ref="customUserDetailsService"/>
</bean>
</property>
</bean>
AuthenticationProvider에는 PreAuthenticatedAuthenticationProvider 클래스를 이용한다. 이 때 preAuthenticatedUserDetailsService 프로퍼티에 주는 UserDetailsService는 UserDetailsByNameServiceWrapper 클래스에 의해 래퍼 된 것이 아니면 안됩니다.
FORM_LOGIN_FILER 맞춤설정
「FORM_LOGIN_FILER」의 커스터마이즈는 이하와 같다.
<sec:authentication-manager id="form_authenticationManager">
<sec:authentication-provider user-service-ref="customUserDetailsService" >
</sec:authentication-provider>
</sec:authentication-manager>
<bean id="formLoginFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
<property name="authenticationManager" ref="form_authenticationManager" />
<property name="authenticationSuccessHandler" ref="formLoginSuccessHandler" />
<property name="authenticationFailureHandler" ref="formLoginFailureHandler" />
<property name="filterProcessesUrl" value="/login" />
</bean>
여기서, 커스텀 필터를 사용하므로, 이하와 같이 태그의 entry-point-ref 속성을 설정할 필요가 있는 점에 주의.
<sec:http auto-config="false" use-expressions="true" entry-point-ref="loginUrlAuthenticationEntryPoint">
~中略~
<sec:custom-filter position="PRE_AUTH_FILTER" ref="siteminderFilter" />
<sec:custom-filter position="FORM_LOGIN_FILTER" ref="formLoginFilter" />
</sec:http>
<bean id="loginUrlAuthenticationEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
<constructor-arg value="/loginPage" />
</bean>
실물
이하로부터 동작 확인이 가능하다. 1
htps // 짱 dy가 fぉゔぇr. 어리석은 p. 코m/
① 로그인 화면에서 username에 "user", password에 "password"를 입력하고 로그인하면 인증됩니다.
② HTTP 요청 헤더의 속성 "SM_USER"에 값 "user"를 설정 2 그러면 인증된다.
여기서는 이하의 기사로 소개되고 있는 ModHeader를 이용한다.
브라우저의 HTTP 헤더에 외부에서 자격 증명 설정 - Qiita
htps : // 코 m / 토토 g / ms / 1 예 b25d27 8 8 33 8
실행 결과
HTTP 요청 헤더의 속성 "SM_USER"에 값 "user"를 설정한다.
이 상태에서, 예를 들면 이하의 URL에 액세스한다.
그러면 인증되므로 페이지가 표시됩니다.
HTTP 요구 헤더에 속성 「SM_USER」가 설정되어 있지 않은 경우는 로그인 화면으로 천이하기 때문에, username과 password에 의해 인증된다.
참고 URL
Spring Security 사용법 메모 인증 및 인가 - Qiita
htps : // 코 m / 오 글 8080 / ms / 032 에 d0 푸 27 아 239 bdc 1
03-1.Spring Security 2 설정 방법 - soracane
htps : // / s. 오, ぇ. 코 m / 해 / 소라 카네 / 호메 / sp 링 g에 대해
테크노트 – spring security 인증 처리를 자작하는 방법을 설명
ㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅡㅡ 네 t/sp 린 g/sp 린 g-세쿠리 ty-㎉ 긴-후 l r-오리 기나 l/
Spring Security 적용 시 작업 노트 - 나미히라 블로그
htp // 나미히라. 하테나 bぉg. 코m/엔트리/20160817/1471396975
AbstractAuthenticationProcessingFilter (Spring Security 4.2.6.RELEASE API)
https://docs.spring.io/spring-security/site/docs/4.2.6.RELEASE/apidocs/org/springframework/security/web/authentication/AbstractAuthenticationProcessingFilter.html
Spring Security Java - Multiple Authentication Manager - 2 bean found error - Stack Overflow
h tps : // s t c ゔ ぇ rf ぉ w. 코 m / 쿠에 s 치온 s / 32105846 / sp rin g-sekuri ty- ゔ ぁ- mu l chi p ぇ - 어서 ㅇ 치카치 온 - 마나게 r 2-be an-fu 응 에로 r
대단히 죄송합니다만 기사 투고 시점에서는 https에 대응하고 있지 않다고 하는 것입니다(인증인데!). 죄송합니다. 시간 만들어 대응해 둡니다. ↩
리퀘스트 헤더의 속성명 「SM_USER」는 어디까지나 일례. 실제의 개발에서는, 속성명은 추측하기 어려운 것으로 하고 기밀 사항으로 해야 한다. ↩
Reference
이 문제에 관하여(Spring Security에서 Form 인증과 Request-Header 인증을 함께 사용하는 구현 예제), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ShandyGaffLover/items/73fb131fe70bb0a1e896
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
다음과 같이 설정한다.
htps : // 기주 b. 이 m/짱 dy가 fぉゔぇr/사 mpぇ001/bぉb/마s r/src/마이/레소 rs/sp 린g せくりty. xml
해설
'PRE_AUTH_FILTER'와 'FORM_LOGIN_FILER'의 두 가지를 맞춤설정합니다.
<sec:custom-filter position="PRE_AUTH_FILTER" ref="siteminderFilter" />
<sec:custom-filter position="FORM_LOGIN_FILTER" ref="formLoginFilter" />
PRE_AUTH_FILTER 맞춤설정
「PRE_AUTH_FILTER」의 커스터마이즈는 이하와 같이 RequestHeaderAuthenticationFilter 클래스를 이용한다. Form 인증과 함께 사용할 때 exceptionIfHeaderMissing 속성을 false로, continueFilterChainOnUnsuccessfulAuthentication 속성을 true로 설정합니다.
<bean id="siteminderFilter" class="org.springframework.security.web.authentication.preauth.RequestHeaderAuthenticationFilter">
<property name="principalRequestHeader" value="SM_USER"/>
<property name="authenticationManager" ref="sm_authenticationManager" />
<property name="exceptionIfHeaderMissing" value="false"/>
<property name="continueFilterChainOnUnsuccessfulAuthentication" value="true"/>
</bean>
여기서, AuthenticationManager(와 AuthenticationProvider)는 이하와 같이 정의한다.
<sec:authentication-manager id="sm_authenticationManager">
<sec:authentication-provider ref="preauthAuthProvider" />
</sec:authentication-manager>
<bean id="preauthAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
<property name="preAuthenticatedUserDetailsService">
<bean id="userDetailsServiceWrapper"
class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper">
<property name="userDetailsService" ref="customUserDetailsService"/>
</bean>
</property>
</bean>
AuthenticationProvider에는 PreAuthenticatedAuthenticationProvider 클래스를 이용한다. 이 때 preAuthenticatedUserDetailsService 프로퍼티에 주는 UserDetailsService는 UserDetailsByNameServiceWrapper 클래스에 의해 래퍼 된 것이 아니면 안됩니다.
FORM_LOGIN_FILER 맞춤설정
「FORM_LOGIN_FILER」의 커스터마이즈는 이하와 같다.
<sec:authentication-manager id="form_authenticationManager">
<sec:authentication-provider user-service-ref="customUserDetailsService" >
</sec:authentication-provider>
</sec:authentication-manager>
<bean id="formLoginFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
<property name="authenticationManager" ref="form_authenticationManager" />
<property name="authenticationSuccessHandler" ref="formLoginSuccessHandler" />
<property name="authenticationFailureHandler" ref="formLoginFailureHandler" />
<property name="filterProcessesUrl" value="/login" />
</bean>
여기서, 커스텀 필터를 사용하므로, 이하와 같이 태그의 entry-point-ref 속성을 설정할 필요가 있는 점에 주의.
<sec:http auto-config="false" use-expressions="true" entry-point-ref="loginUrlAuthenticationEntryPoint">
~中略~
<sec:custom-filter position="PRE_AUTH_FILTER" ref="siteminderFilter" />
<sec:custom-filter position="FORM_LOGIN_FILTER" ref="formLoginFilter" />
</sec:http>
<bean id="loginUrlAuthenticationEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
<constructor-arg value="/loginPage" />
</bean>
실물
이하로부터 동작 확인이 가능하다. 1
htps // 짱 dy가 fぉゔぇr. 어리석은 p. 코m/
① 로그인 화면에서 username에 "user", password에 "password"를 입력하고 로그인하면 인증됩니다.
② HTTP 요청 헤더의 속성 "SM_USER"에 값 "user"를 설정 2 그러면 인증된다.
여기서는 이하의 기사로 소개되고 있는 ModHeader를 이용한다.
브라우저의 HTTP 헤더에 외부에서 자격 증명 설정 - Qiita
htps : // 코 m / 토토 g / ms / 1 예 b25d27 8 8 33 8
실행 결과
HTTP 요청 헤더의 속성 "SM_USER"에 값 "user"를 설정한다.
이 상태에서, 예를 들면 이하의 URL에 액세스한다.
그러면 인증되므로 페이지가 표시됩니다.
HTTP 요구 헤더에 속성 「SM_USER」가 설정되어 있지 않은 경우는 로그인 화면으로 천이하기 때문에, username과 password에 의해 인증된다.
참고 URL
Spring Security 사용법 메모 인증 및 인가 - Qiita
htps : // 코 m / 오 글 8080 / ms / 032 에 d0 푸 27 아 239 bdc 1
03-1.Spring Security 2 설정 방법 - soracane
htps : // / s. 오, ぇ. 코 m / 해 / 소라 카네 / 호메 / sp 링 g에 대해
테크노트 – spring security 인증 처리를 자작하는 방법을 설명
ㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅡㅡ 네 t/sp 린 g/sp 린 g-세쿠리 ty-㎉ 긴-후 l r-오리 기나 l/
Spring Security 적용 시 작업 노트 - 나미히라 블로그
htp // 나미히라. 하테나 bぉg. 코m/엔트리/20160817/1471396975
AbstractAuthenticationProcessingFilter (Spring Security 4.2.6.RELEASE API)
https://docs.spring.io/spring-security/site/docs/4.2.6.RELEASE/apidocs/org/springframework/security/web/authentication/AbstractAuthenticationProcessingFilter.html
Spring Security Java - Multiple Authentication Manager - 2 bean found error - Stack Overflow
h tps : // s t c ゔ ぇ rf ぉ w. 코 m / 쿠에 s 치온 s / 32105846 / sp rin g-sekuri ty- ゔ ぁ- mu l chi p ぇ - 어서 ㅇ 치카치 온 - 마나게 r 2-be an-fu 응 에로 r
대단히 죄송합니다만 기사 투고 시점에서는 https에 대응하고 있지 않다고 하는 것입니다(인증인데!). 죄송합니다. 시간 만들어 대응해 둡니다. ↩
리퀘스트 헤더의 속성명 「SM_USER」는 어디까지나 일례. 실제의 개발에서는, 속성명은 추측하기 어려운 것으로 하고 기밀 사항으로 해야 한다. ↩
Reference
이 문제에 관하여(Spring Security에서 Form 인증과 Request-Header 인증을 함께 사용하는 구현 예제), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ShandyGaffLover/items/73fb131fe70bb0a1e896
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
<sec:custom-filter position="PRE_AUTH_FILTER" ref="siteminderFilter" />
<sec:custom-filter position="FORM_LOGIN_FILTER" ref="formLoginFilter" />
<bean id="siteminderFilter" class="org.springframework.security.web.authentication.preauth.RequestHeaderAuthenticationFilter">
<property name="principalRequestHeader" value="SM_USER"/>
<property name="authenticationManager" ref="sm_authenticationManager" />
<property name="exceptionIfHeaderMissing" value="false"/>
<property name="continueFilterChainOnUnsuccessfulAuthentication" value="true"/>
</bean>
<sec:authentication-manager id="sm_authenticationManager">
<sec:authentication-provider ref="preauthAuthProvider" />
</sec:authentication-manager>
<bean id="preauthAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
<property name="preAuthenticatedUserDetailsService">
<bean id="userDetailsServiceWrapper"
class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper">
<property name="userDetailsService" ref="customUserDetailsService"/>
</bean>
</property>
</bean>
<sec:authentication-manager id="form_authenticationManager">
<sec:authentication-provider user-service-ref="customUserDetailsService" >
</sec:authentication-provider>
</sec:authentication-manager>
<bean id="formLoginFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
<property name="authenticationManager" ref="form_authenticationManager" />
<property name="authenticationSuccessHandler" ref="formLoginSuccessHandler" />
<property name="authenticationFailureHandler" ref="formLoginFailureHandler" />
<property name="filterProcessesUrl" value="/login" />
</bean>
<sec:http auto-config="false" use-expressions="true" entry-point-ref="loginUrlAuthenticationEntryPoint">
~中略~
<sec:custom-filter position="PRE_AUTH_FILTER" ref="siteminderFilter" />
<sec:custom-filter position="FORM_LOGIN_FILTER" ref="formLoginFilter" />
</sec:http>
<bean id="loginUrlAuthenticationEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
<constructor-arg value="/loginPage" />
</bean>
이하로부터 동작 확인이 가능하다. 1
htps // 짱 dy가 fぉゔぇr. 어리석은 p. 코m/
① 로그인 화면에서 username에 "user", password에 "password"를 입력하고 로그인하면 인증됩니다.
② HTTP 요청 헤더의 속성 "SM_USER"에 값 "user"를 설정 2 그러면 인증된다.
여기서는 이하의 기사로 소개되고 있는 ModHeader를 이용한다.
브라우저의 HTTP 헤더에 외부에서 자격 증명 설정 - Qiita
htps : // 코 m / 토토 g / ms / 1 예 b25d27 8 8 33 8
실행 결과
HTTP 요청 헤더의 속성 "SM_USER"에 값 "user"를 설정한다.
이 상태에서, 예를 들면 이하의 URL에 액세스한다.
그러면 인증되므로 페이지가 표시됩니다.
HTTP 요구 헤더에 속성 「SM_USER」가 설정되어 있지 않은 경우는 로그인 화면으로 천이하기 때문에, username과 password에 의해 인증된다.
참고 URL
Spring Security 사용법 메모 인증 및 인가 - Qiita
htps : // 코 m / 오 글 8080 / ms / 032 에 d0 푸 27 아 239 bdc 1
03-1.Spring Security 2 설정 방법 - soracane
htps : // / s. 오, ぇ. 코 m / 해 / 소라 카네 / 호메 / sp 링 g에 대해
테크노트 – spring security 인증 처리를 자작하는 방법을 설명
ㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅡㅡ 네 t/sp 린 g/sp 린 g-세쿠리 ty-㎉ 긴-후 l r-오리 기나 l/
Spring Security 적용 시 작업 노트 - 나미히라 블로그
htp // 나미히라. 하테나 bぉg. 코m/엔트리/20160817/1471396975
AbstractAuthenticationProcessingFilter (Spring Security 4.2.6.RELEASE API)
https://docs.spring.io/spring-security/site/docs/4.2.6.RELEASE/apidocs/org/springframework/security/web/authentication/AbstractAuthenticationProcessingFilter.html
Spring Security Java - Multiple Authentication Manager - 2 bean found error - Stack Overflow
h tps : // s t c ゔ ぇ rf ぉ w. 코 m / 쿠에 s 치온 s / 32105846 / sp rin g-sekuri ty- ゔ ぁ- mu l chi p ぇ - 어서 ㅇ 치카치 온 - 마나게 r 2-be an-fu 응 에로 r
대단히 죄송합니다만 기사 투고 시점에서는 https에 대응하고 있지 않다고 하는 것입니다(인증인데!). 죄송합니다. 시간 만들어 대응해 둡니다. ↩
리퀘스트 헤더의 속성명 「SM_USER」는 어디까지나 일례. 실제의 개발에서는, 속성명은 추측하기 어려운 것으로 하고 기밀 사항으로 해야 한다. ↩
Reference
이 문제에 관하여(Spring Security에서 Form 인증과 Request-Header 인증을 함께 사용하는 구현 예제), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ShandyGaffLover/items/73fb131fe70bb0a1e896
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Spring Security 사용법 메모 인증 및 인가 - Qiita
htps : // 코 m / 오 글 8080 / ms / 032 에 d0 푸 27 아 239 bdc 1
03-1.Spring Security 2 설정 방법 - soracane
htps : // / s. 오, ぇ. 코 m / 해 / 소라 카네 / 호메 / sp 링 g에 대해
테크노트 – spring security 인증 처리를 자작하는 방법을 설명
ㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅡㅡ 네 t/sp 린 g/sp 린 g-세쿠리 ty-㎉ 긴-후 l r-오리 기나 l/
Spring Security 적용 시 작업 노트 - 나미히라 블로그
htp // 나미히라. 하테나 bぉg. 코m/엔트리/20160817/1471396975
AbstractAuthenticationProcessingFilter (Spring Security 4.2.6.RELEASE API)
https://docs.spring.io/spring-security/site/docs/4.2.6.RELEASE/apidocs/org/springframework/security/web/authentication/AbstractAuthenticationProcessingFilter.html
Spring Security Java - Multiple Authentication Manager - 2 bean found error - Stack Overflow
h tps : // s t c ゔ ぇ rf ぉ w. 코 m / 쿠에 s 치온 s / 32105846 / sp rin g-sekuri ty- ゔ ぁ- mu l chi p ぇ - 어서 ㅇ 치카치 온 - 마나게 r 2-be an-fu 응 에로 r
대단히 죄송합니다만 기사 투고 시점에서는 https에 대응하고 있지 않다고 하는 것입니다(인증인데!). 죄송합니다. 시간 만들어 대응해 둡니다. ↩
리퀘스트 헤더의 속성명 「SM_USER」는 어디까지나 일례. 실제의 개발에서는, 속성명은 추측하기 어려운 것으로 하고 기밀 사항으로 해야 한다. ↩
Reference
이 문제에 관하여(Spring Security에서 Form 인증과 Request-Header 인증을 함께 사용하는 구현 예제), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ShandyGaffLover/items/73fb131fe70bb0a1e896텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)