2011-03-17 21 views
0

我正在構建一個簡單的Sring MVC應用程序。現在我正在嘗試添加Spring安全性。我添加了一個使用DAO訪問MySql數據庫並獲取用戶的customUserDetailsServiceSpring Security 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; 
    } 
} 

,我已經加入UserDetailsServiceSpring-security.xml

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

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

我把j_spring_security_check作爲行動的登錄表單login.jsp頁面上。

當我輸入一個有效的用戶名和密碼時,應用程序總是告訴它是錯誤的。更重要的是,我找不到任何證據表明customUserDetailsService隨時都在運行。 (我用System.out.println("Checking if this is invoked")檢查服務器)。

什麼調用CustomUserDetailsServiceloadUserByUsername()方法?什麼時候被調用?

我該如何配置它? (我提供的可能是不必要的:)所有的代碼)

編輯

: 這裏是其餘彈簧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 2011-03-17 11:19:47

+0

您正在構建一個新的應用程序,但使用Spring Security的古老版本?你爲什麼要這樣做?目前的版本是3.0.5 http://static.springsource.org/spring-security/site/reference.html – 2011-03-17 15:14:57

+0

@ Sean Patrik Floyd 我正在學習一個教程。該教程使用該版本。我嘗試使用新版本。但遇到了一些未知的標籤問題。因此決定改用舊版本。除了我正在學習Spring Security概念。不是具體的。 – 2011-03-21 07:24:23

回答

2

分享更多配置。來自Spring-security.xml將有所幫助(如果可能的話)

Spring安全性旨在讓您的身份驗證提供程序調用方法UserDetailsService,它返回userDetails對象。 工藝過程如下:

  • Authentication Manager任務是要認證的用戶。所以它將用戶名發送到Authentication provider

  • Authentication Provider調用loadUserByUsername()方法並傳遞類型爲String的用戶名返回userDetails對象。

  • 現在這個userDetails對象包含所有必要的認證信息,如用戶名,密碼的IsEnabled等

現在,如果你想定製userDetailsService使用您的Dao您可以自定義它。

這就是您的身份驗證過程的工作原理。 您可以參考link以獲得更廣泛的理解。

+0

謝謝@Sagara。我編輯了這個問題。 – 2011-03-21 07:37:06

+0

此外,認證管理器別名的用途是什麼?起初,當我試圖在服務器中部署EAR時,部署錯誤告訴我要向認證管理器添加一個別名。 – 2011-03-21 07:48:36

相關問題