2013-02-27 113 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