2009-07-23 1 views
3

현재 Spring Security를 ​​사용하여 웹 응용 프로그램을 작성 중입니다. 우리는 사용자 이름과 암호로 사용자를 인증하는 웹 서비스를 가지고 있습니다.사용자 이름과 암호가 필요한 WebService를 사용하여 SpringSecurity로 사용자 인증

웹 서비스 :
String[] login(String username, String password);

어떻게 스프링 시큐리티는 웹 서비스에 제공된 사용자 이름과 암호를 전달하기 위해 내가 어떻게 구성해야합니까?

사용자 이름 만 수신하는 UserDetailsService을 작성했습니다.


나는이 문제가 귀하의 XML에 있다고 생각합니다. 자동 설정을 해제 했습니까? 그리고 클래스는 AbstractUserDetailsAuthenticationProvider를 확장합니까?

답변

4

org.acegisecurity.providers.dao.AbstractUserDetailsAuthenticationProvider 확장

나는 다음과 같은 클래스에 쓴
/** 
* @author rodrigoap 
* 
*/ 
public class WebServiceUserDetailsAuthenticationProvider extends 
    AbstractUserDetailsAuthenticationProvider { 

    @Override 
    protected UserDetails retrieveUser(String username, 
     UsernamePasswordAuthenticationToken authentication) 
     throws AuthenticationException { 
    //Improve this line: 
    String password = authentication.getCredentials().toString(); 
    // Invoke your webservice here 
    GrantedAuthority[] grantedAuth = loginWebService.login(username, password); 
    // create UserDetails. Warning: User is deprecated! 
    UserDetails userDetails = new User(username, password, grantedAuth); 
    return userDetails; 
    } 

} 
0

UserDetailsService의 개념은 사용자가 해당 사용자 이름을 나타내는 UserDetails 객체를 제공하고 Spring Security가 자격 증명을 검사하는 것을 처리한다는 것입니다.

암호가 매개 변수로 필요하기 때문에 이러한 종류의 디자인이 백엔드에서 제대로 작동하지 않으면 사용자 자신의 AuthenticationProvider 구현을 살펴볼 필요가 있습니다.

4

:

@Override 
protected UserDetails retrieveUser(String username, UsernamePasswordAuthenticationToken token) throws AuthenticationException { 
    try { 
     server = (PncUtilRemote) new InitialContext().lookup("PncUtilBean"); 
     if (server != null) { 
      String password = SHA1(token.getCredentials().toString()); 
      String[] auth = server.login(username, password); 
      if (auth.length > 0) { 
       PncUserDetails details = new PncUserDetails(username, password); 
       for (int i = 0; i < auth.length; i++) { 
        details.addAuthority(auth[i]); 
       } 
       return details; 
      } 
     } 
    } catch (Exception e) { 
     System.out.println("! " + e.getClass().getName() + " in com.logica.pnc.security.PncUserDetailsAuthenticationProvider.retrieveUser(String, UsernamePasswordAuthenticationToken): " + e.getMessage()); 
    } 
    throw new BadCredentialsException(""); 
} 

다음 recieveUser 메도를 구현

PncUserDetailsAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider

를 사용하면 응용 프로그램의 context.xml 파일에 몇 줄을 추가 할 필요가 당신의 AuthenticationProvider을 사용하려면 다음에

 
<security:http auto-config="false" /> 

감사 :

 
<bean id="authenticationManager" class="org.springframework.security.providers.ProviderManager"> 
    <property name="providers"> 
     <list><ref local="PncAuthenticationProvider" /></list> 
    </property> 
</bean> 

<bean id="PncAuthenticationProvider" class="com.logica.pnc.security.PncUserDetailsAuthenticationProvider"> 
    <security:custom-authentication-provider /> 
</bean> 

당신이 false로 자동 구성을 설정하는 것이 중요하다 rodrigoap을 가리켜 인증 제공자 :