스프링 보안을 사용하여 RESTful 웹 서비스에 인증해야하는 SpringMVC 웹 애플리케이션이있다. 사용자 이름과 비밀번호를 보낸다. 사용자가 기록되면 쿠키를 사용자의 브라우저로 설정해야하며 이후의 호출에서는 쿠키를 사용하여 다른 RESTful 웹 서비스로 사용자 세션의 유효성을 검사합니다.휴식 웹 서비스로 Spring MVC + Spring 보안 로그인
나는 곳곳을 돌아보고 있었지만,이를 수행하는 방법에 대한 좋은 예를 찾을 수 없었고, 모든 시도는 헛된 것이 었습니다. 여기
내가 생각하고있는 것입니다 : I 선언이 인증 공급자, 첫 번째 검사 쿠키를 가질 수 있고, 어떤 이유로 실패 할 경우 사용자 이름과 함께 확인 두 번째로 이동암호 (해당 요청에 사용자 이름과 암호가없는 경우에도 실패합니다).
두 서비스는 매번 사용자 권한을 반환하고 스프링 보안은 "상태 비 저장"입니다.
반면에 동일한 문제가있는 예제 나 다른 누군가를 찾는 것이 너무 어려웠 기 때문에이 접근법이 올바른지 스스로에게 질문했습니다. 이 접근 방식이 잘못 되었습니까?
JDBC 인증 대신이 작업을 수행하려는 이유는 내 웹 응용 프로그램이 모두 상태가없고 데이터베이스가 항상 "청원 대기열"을 감싸는 RESTful 웹 서비스를 통해 액세스되기 때문에이 것을 존중하고 싶습니다. 사용자 인증 및 유효성 검사에도 사용됩니다.
지금까지 어떤 시도를 했습니까? 오래 긴 springSecurity-context.xml을 붙여 넣을 수는 있지만 대신 지금 나열 해 보겠습니다 :
- authenticationSuccessHandler와 함께 custom authenticationFilter를 사용하십시오. 사용자가 이미이 지점에 로그인했기 때문에 분명히 작동하지 않습니다.
- 진입 점 참조 필터를 구현합니다.
- BASIC_AUTH_FILTER 위치에 사용자 정의 필터를 수행하십시오.
- 맞춤 인증 공급자를 만드십시오 (행운을 많이 빕니다!). 나는 대답을 얻는 동안 이것을 다시 시도하고있다.
- 대신 질문을하기로 결정했을 때 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 { ... }
질문을 편집하는 대신 해결책으로 답을 게시하십시오. ;) – bluish