2011-03-17 1 views
0

나는 간단한 Sring MVC 애플리케이션을 만들고있다. 이제 스프링 보안을 추가하려고합니다. DAO를 사용하여 MySql 데이터베이스에 액세스하고 사용자를 얻는 customUserDetailsService을 추가했습니다.스프링 보안 2.0.6 UserDetailService의 loadUserByName 메소드를 호출하는 것

@Transactional(readOnly = true) 
public class CustomUserDetailService implements UserDetailsService { 

    @EJB(name = "UserDAOLocal") 
    UserDAOLocal dao = null; 

    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException { 
     System.out.println("Checking if this is invoked") 
     UserDetails user = null; 
     DBUsers dbUser = dao.findUserName(username); 

     user = new User(dbUser.getUserName(), dbUser.getPassword(), true, true, true, true, getAuthorities(dbUser.getAccess())); 
     return user; 
    } 

    private GrantedAuthority[] getAuthorities(Integer access) { 

     GrantedAuthority[] authList = new GrantedAuthority[2]; 

     authList[0] = new GrantedAuthorityImpl("ROLE_USER"); 
     if (access.compareTo(1) == 0) { 
      authList[1] = new GrantedAuthorityImpl(("ROLE_ADMIN")); 

     } 
     return authList; 
    } 
} 

이와 나는 Spring-security.xmlUserDetailsService을 추가했습니다.

<security:authentication-manager alias="authenticationManager"> 
    <security:authentication-provider user-service-ref="customUserDetailsService"/> 
</security:authentication-manager> 

<bean id="customUserDetailsService" class="service.CustomUserDetailService"/> 

은 내가 login.jsp 페이지의 로그인 폼에 대한 작업으로 j_spring_security_check을 넣어.

유효한 사용자 이름과 암호를 입력하면 앱에서 항상 잘못되었음을 알립니다. 더 중요한 것은 customUserDetailsService이 언제든지 실행되고 있다는 증거를 찾을 수 없다는 것입니다. (나는 서버를 확인하기 위해 System.out.println("Checking if this is invoked")를 사용했다).

무엇 CustomUserDetailsService 메서드를 호출합니까? 호출되는 시점은 언제입니까?

어떻게 구성 할 수 있습니까?

EDIT (모든 코드는 내가 :) 필요 수 있습니다 제공) : 여기 이의 나머지 부분입니다 봄 - Security.xml

<security:http auto-config="true"> 


    <security:intercept-url pattern="/AddEmployee.htm" access="ROLE_ADMIN"/> 
    <security:intercept-url pattern="/FireEmployee.htm" access="ROLE_ADMIN"/> 
    <security:intercept-url pattern="/employees.htm" access="ROLE_USER"/> 

    <security:form-login login-page="/login.htm" 
authentication-failure-url="/login.htm?error=true" 
login-processing-url="/j_spring_security_check.htm" 
default-target-url="/common.htm"/> 

    <security:logout 
invalidate-session="true" 
logout-success-url="/login.htm" 
logout-url="/logout.htm"/> 

</security:http> 

나는 인증을 편집하여 문제를 해결했다 이 같은 공급자. 나는 DAO와 사용자 데이터베이스를 사용하지 않기로 결정했다. xml 파일 내에서 하드 코딩 된 사용자를 사용했습니다.

<security:authentication-provider> 
    <security:user-service> 
     <security:user name="sam" password="sam123" authorities="ROLE_ADMIN,ROLE_USER" /> 
     <security:user name="pam" password="pam123" authorities="ROLE_USER" /> 
    </security:user-service> 
</security:authentication-provider> 

이것은 완벽하게 작동합니다.

하지만 내 customUserDetailService가 사용되지 않은 이유를 알고 싶습니다. 올바르게 사용하는 법을 배우십시오.

+0

webapp에서 디버그 로그를 사용하면 더 많은 정보를 얻을 수 있습니다. – Raghuram

+0

새로운 애플리케이션을 만들고 있지만 스프링 보안의 고대 버전을 사용하고 있습니까? 왜 지구상에서 그걸 할거야? 현재 버전은 3.0.5입니다. http://static.springsource.org/spring-security/site/reference.html –

+0

@Sean Patrik Floyd 자습서를 진행하고있었습니다. 이 자습서에서는 해당 버전을 사용했습니다. 새로운 버전을 사용해 보았습니다. 그러나 일부 알려지지 않은 태그 문제가 발생했습니다. 따라서 이전 버전을 대신 사용하기로 결정했습니다. 게다가 나는 봄 보안 개념을 배우려고 노력하고있다. 세부 사항이 아닙니다. –

답변

2

더 많은 설정 공유. Spring-security.xml의 도움을 받아

귀하의 인증 공급자가 UserDetailsService userDetails Object를 반환하는 loadUserByUsername() 메서드를 호출하도록 설계되었습니다. 다음과 같이 프로세스는 다음과 같습니다 Authentication Manager

  • 작업은 사용자를 인증하는 것입니다. 그래서 사용자 이름을 Authentication provider으로 보냅니다.

  • Authentication ProviderloadUserByUsername() 메서드를 호출하고 userDetails 개체를 반환하는 String 유형의 사용자 이름을 전달합니다.

  • 지금이 userDetails 목적은 모든 등 사용자 이름, 암호의 IsEnabled 지금 당신은 당신의 Dao 당신이 그것을 사용자 정의 할 수 있습니다 사용하는 userDetailsService을 사용자 정의 할 경우

등의 인증에 필요한 정보가 포함되어 있습니다.

이렇게하면 인증 프로세스가 작동합니다. 자세한 내용은 link을 참조하십시오.

+0

감사합니다. @Sagara. 나는 그 질문을 편집했다. –

+0

인증 관리자의 별칭 사용은 무엇입니까? 처음에 서버에 EAR을 배포하려고 시도했을 때 인증 관리자에게 별칭을 추가하라는 배포 오류가 발생했습니다. –