2013-08-13 5 views
5

스프링 보안을 사용하여 RESTful 웹 서비스에 인증해야하는 SpringMVC 웹 애플리케이션이있다. 사용자 이름과 비밀번호를 보낸다. 사용자가 기록되면 쿠키를 사용자의 브라우저로 설정해야하며 이후의 호출에서는 쿠키를 사용하여 다른 RESTful 웹 서비스로 사용자 세션의 유효성을 검사합니다.휴식 웹 서비스로 Spring MVC + Spring 보안 로그인

나는 곳곳을 돌아보고 있었지만,이를 수행하는 방법에 대한 좋은 예를 찾을 수 없었고, 모든 시도는 헛된 것이 었습니다. 여기

내가 생각하고있는 것입니다 :

I 선언이 인증 공급자, 첫 번째 검사 쿠키를 가질 수 있고, 어떤 이유로 실패 할 경우 사용자 이름과 함께 확인 두 번째로 이동

암호 (해당 요청에 사용자 이름과 암호가없는 경우에도 실패합니다).

두 서비스는 매번 사용자 권한을 반환하고 스프링 보안은 "상태 비 저장"입니다.

반면에 동일한 문제가있는 예제 나 다른 누군가를 찾는 것이 너무 어려웠 기 때문에이 접근법이 올바른지 스스로에게 질문했습니다. 이 접근 방식이 잘못 되었습니까?

JDBC 인증 대신이 작업을 수행하려는 이유는 내 웹 응용 프로그램이 모두 상태가없고 데이터베이스가 항상 "청원 대기열"을 감싸는 RESTful 웹 서비스를 통해 액세스되기 때문에이 것을 존중하고 싶습니다. 사용자 인증 및 유효성 검사에도 사용됩니다.

지금까지 어떤 시도를 했습니까? 오래 긴 springSecurity-context.xml을 붙여 넣을 수는 있지만 대신 지금 나열 해 보겠습니다 :

  1. authenticationSuccessHandler와 함께 custom authenticationFilter를 사용하십시오. 사용자가 이미이 지점에 로그인했기 때문에 분명히 작동하지 않습니다.
  2. 진입 점 참조 필터를 구현합니다.
  3. BASIC_AUTH_FILTER 위치에 사용자 정의 필터를 수행하십시오.
  4. 맞춤 인증 공급자를 만드십시오 (행운을 많이 빕니다!). 나는 대답을 얻는 동안 이것을 다시 시도하고있다.
  5. 대신 질문을하기로 결정했을 때 CAS를 사용하기 시작했습니다. 어쩌면 미래에 나는 webapp에 CAS 서버가 있다고 생각할 수 있지만, 잠시 동안 이것은 엄청난 과잉이라고 느껴진다.

미리 감사드립니다.

나는 봄 보안 3.1.4 및 봄 MVC 3.2를 사용하고 있습니다.3

편집 : 내가 무슨 짓을했는지에 대한 몇 가지 빛이 나는 대답 여기

에게 @coder에에게 감사를 할 수 WAS, 나는이 모든 것을 문서화하고 여기에 또는 블로그 게시물에 게시하려고합니다 곧 언젠가 :

<http use-expressions="true" create-session="stateless" entry-point-ref="loginUrlAuthenticationEntryPoint" 
     authentication-manager-ref="customAuthenticationManager"> 
    <custom-filter ref="restAuthenticationFilter" position="FORM_LOGIN_FILTER" /> 
    <custom-filter ref="restPreAuthFilter" position="PRE_AUTH_FILTER" /> 
    <intercept-url pattern="/signin/**" access="permitAll" /> 
    <intercept-url pattern="/img/**" access="permitAll" /> 
    <intercept-url pattern="/css/**" access="permitAll" /> 
    <intercept-url pattern="/js/**" access="permitAll" /> 
    <intercept-url pattern="/**" access="hasRole('ROLE_USER')" /> 

</http> 

<authentication-manager id="authManager" alias="authManager"> 
    <authentication-provider ref="preauthAuthProvider" /> 
</authentication-manager> 

<beans:bean id="restPreAuthFilter" class="com.company.CustomPreAuthenticatedFilter"> 
    <beans:property name="cookieName" value="SessionCookie" /> 
    <beans:property name="checkForPrincipalChanges" value="true" /> 
    <beans:property name="authenticationManager" ref="authManager" /> 
</beans:bean> 

<beans:bean id="preauthAuthProvider" 
    class="com.company.CustomPreAuthProvider"> 
    <beans:property name="preAuthenticatedUserDetailsService"> 
     <beans:bean id="userDetailsServiceWrapper" 
      class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper"> 
      <beans:property name="userDetailsService" ref="userDetailsService" /> 
     </beans:bean> 
    </beans:property> 
</beans:bean> 

<beans:bean id="userDetailsService" class="com.company.CustomUserDetailsService" /> 

<beans:bean id="loginUrlAuthenticationEntryPoint" 
    class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint"> 
    <beans:constructor-arg value="/signin" /> 
</beans:bean> 

<beans:bean id="customAuthenticationManager" 
    class="com.company.CustomAuthenticationManager" /> 

<beans:bean id="restAuthenticationFilter" 
    class="com.company.CustomFormLoginFilter"> 
    <beans:property name="filterProcessesUrl" value="/signin/authenticate" /> 
    <beans:property name="authenticationManager" ref="customAuthenticationManager" /> 
    <beans:property name="authenticationFailureHandler"> 
     <beans:bean 
      class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler"> 
      <beans:property name="defaultFailureUrl" value="/login?login_error=t" /> 
     </beans:bean> 
    </beans:property> 
</beans:bean> 

그리고 사용자 정의 구현이 같은 있습니다 :

// Here, the idea is to write authenticate method and return a new UsernamePasswordAuthenticationToken 
public class CustomAuthenticationManager implements AuthenticationManager { ... } 

// Write attemptAuthentication method and return UsernamePasswordAuthenticationToken 
public class CustomFormLoginFilter extends UsernamePasswordAuthenticationFilter { ... } 

// Write getPreAuthenticatedPrincipal and getPreAuthenticatedCredentials methods and return cookieName and cookieValue respectively 
public class CustomPreAuthenticatedFilter extends AbstractPreAuthenticatedProcessingFilter { ... } 

// Write authenticate method and return Authentication auth = new UsernamePasswordAuthenticationToken(name, token, grantedAuths); (or null if can't be pre-authenticated) 
public class CustomPreAuthProvider extends PreAuthenticatedAuthenticationProvider{ ... } 

// Write loadUserByUsername method and return a new UserDetails user = new User("hectorg87", "123456", Collections.singletonList(new GrantedAuthorityImpl("ROLE_USER"))); 
public class CustomUserDetailsService implements UserDetailsService { ... } 
+0

질문을 편집하는 대신 해결책으로 답을 게시하십시오. ;) – bluish

답변

3
  1. AbstractPreAuthenticatedProcessingFilter를 확장하여 사용자 지정 사전 인증 필터를 정의 할 수 있습니다.
  2. 구현시 getPreAuthenticatedPrincipal() 메소드를 사용하면 쿠키가 존재하는지 확인할 수 있습니다. 및 반환 쿠키 이름이있는 경우 주 쿠키 및 자격 증명의 쿠키 값입니다.
  3. 사용 PreAuthenticatedAuthenticationProvider 및 다른 사람의 유효도 부여 가져 당국은, 사용자 이름/암호를 사용하여 사용자를 인증 BadCredentialsException
  4. 처럼 포함한 AuthenticationException을 던져 폼 로그인 필터, 기본 필터를 추가하면 쿠키가 VALI이 있는지 확인하기 위해 사용자 정의 preAuthenticatedUserDetailsService을 제공 또는 사용자 정의 인증 공급자 (또는 사용자 정의 UserDetailsService의)와 사용자 정의 필터는 사전 인증 필터는 springContext하고 username./password 필터가 호출되지 않습니다에 인증 된 사용자가 설정합니다 존재하는 경우 쿠키에 사용자/암호

을 확인하기 위해, 쿠키가 잘못된/유효하지 않은 경우 인증 진입 점이 인증을 트리거합니다. 사용자 이름/암호를 사용하여 신청하십시오.

희망 하시겠습니까?

+0

안녕하세요 @ 코더, 모든게 의미가 있습니다. 나는 그것을 시도하고 결과를 게시 할 것입니다. 감사! – hectorg87

+1

@ hector87 구현 및 구성을 공유 할 수 있습니까? 감사. –

+0

예, 구현에 대해서도 관심이 있습니다. 어딘가에 게시 할 수 있습니까? 고마워요 –