2013-02-27 139 views
0

我試圖從StackOverflow(Use Spring Security with JPA)關注此帖未成功。春季安全到用戶JPA連接

我實現了一個UserDetailsS​​ervice:

import javax.inject.Inject; 

import org.springframework.dao.DataAccessException; 
import org.springframework.security.core.userdetails.UserDetails; 
import org.springframework.security.core.userdetails.UserDetailsService; 
import org.springframework.security.core.userdetails.UsernameNotFoundException; 
import org.springframework.stereotype.Service; 

import com.boss.mrfoods.dao.UserDao; 
import com.boss.mrfoods.entity.User; 

@Service 
public class LoginController implements UserDetailsService { 

    @Inject 
    private UserDao userDao; 

    @Override 
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException { 
     User user = userDao.getForUsername(username); 

     System.out.println("USERNAME: " + username); 
     System.out.println("USER: " + user); 
     System.out.println("ROLES:" + user.getRoles()); 

     return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), user.getRoles()); 
    } 

} 

而且在Spring XML配置文件中像這樣的一個參考吧:

<debug /> 

<global-method-security pre-post-annotations="enabled" /> 

<http pattern="/resources/**" security="none" /> 
<http pattern="/pages/loggedout.xhtml" security="none" /> 
<http pattern="/pages/timeout.xhtml" security="none" /> 

<http use-expressions="true"> 
    <intercept-url pattern="/pages/admin/**" access="hasRole('supervisor')" /> 
    <intercept-url pattern="/pages/user/**" access="isAuthenticated()" /> 
    <intercept-url pattern="/**" access="permitAll" /> 
    <form-login /> 
    <logout logout-success-url="/pages/loggedout.xhtml" delete-cookies="JSESSIONID" /> 
    <remember-me /> 
</http> 

<beans:bean id="customUserDetailsService" class="com.boss.mrfoods.controller.LoginController" /> 

<authentication-manager> 
    <authentication-provider user-service-ref="customUserDetailsService"> 
     <password-encoder hash="plaintext" /> 
    </authentication-provider> 
</authentication-manager> 

什麼也沒有發生。沒有例外,我的UserDetailsS​​ervice實現永遠不會被調用。

我想要實現的是Spring Security使用我的JPA連接/事務來查找用戶/角色。我是否缺少配置?從哪裏開始尋找問題,如果我甚至沒有得到和例外。

我發現了這麼遠的是:我的userDao爲空。對象注入不起作用。注入無法構建該對象。爲什麼?

感謝您閱讀這篇文章。

+0

你是如何嘗試驗證?你的安全配置中是否有'http'元素? – digitaljoel 2013-02-27 16:43:18

+0

編輯了該問題以顯示更多的XML配置文件。 – MBarni 2013-02-27 17:01:51

回答

0

您可以詳細說明如何登錄到應用程序。你是直接訪問用戶頁面並期待登錄頁面?

你試過設置這樣的登錄頁面,

<form-login 
     login-page="/login.html" 
     login-processing-url="/j_spring_security_check.action" 
     authentication-failure-url="/login_error.html" 
     default-target-url="/home.html" 
     always-use-default-target="true"/> 
+0

我使用默認的登錄表單(可以通過我的XML中的「」行來實現)。 嘗試訪問其中一個受保護頁面時正確顯示了該表單,但是當我嘗試登錄時,我沒有通過身份驗證,我的斷點和系統輸出從不會被調用。 – MBarni 2013-02-28 13:38:35

+0

您可以提供更多關於登錄時發生的情況的詳細信息。你看到錯誤頁面嗎?如果頁面保持在同一屏幕上,您是否看到服務器上的任何異常。如果以上都沒有發生,那麼嘗試使用諸如火蟲等工具來監控請求,以監控提交登錄表單時發生的情況。 – 2013-02-28 15:03:47

+0

該登錄頁面通知2件事:「您的登錄嘗試失敗,請重試。」 「原因:空」。 Spring-Security調試已激活,但未顯示錯誤。系統始終會爲登錄嘗試返回空用戶。 (如果它很重要,那麼當使用XML中定義的靜態用戶時,它都可以工作)。 – MBarni 2013-02-28 22:29:42