Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java can';在SpringSecurity中,我从内存中的数据存储切换到使用数据库后,我不能登录_Java_Spring_Spring Security - Fatal编程技术网

Java can';在SpringSecurity中,我从内存中的数据存储切换到使用数据库后,我不能登录

Java can';在SpringSecurity中,我从内存中的数据存储切换到使用数据库后,我不能登录,java,spring,spring-security,Java,Spring,Spring Security,我正在尝试为我的web应用程序使用Spring安全性。我将要做一个登录功能,这样用户就可以登录到我网站中的安全页面。到目前为止,我一直在使用SpringSecurity自己的,在那里我使用内存中的数据存储进行身份验证(主要是测试它是否有效,因为我还在学习) 当我试图使用存储了不同用户的数据库时,问题就出现了。当我尝试登录时,spring security会将我重定向到“身份验证失败url”,而不是让我登录 我已经创建了一个自定义UserDetails类 package dk.chakula.we

我正在尝试为我的web应用程序使用Spring安全性。我将要做一个登录功能,这样用户就可以登录到我网站中的安全页面。到目前为止,我一直在使用SpringSecurity自己的,在那里我使用内存中的数据存储进行身份验证(主要是测试它是否有效,因为我还在学习)

当我试图使用存储了不同用户的数据库时,问题就出现了。当我尝试登录时,spring security会将我重定向到“身份验证失败url”,而不是让我登录

我已经创建了一个自定义UserDetails类

package dk.chakula.web.security;

import dk.chakula.web.domain.User;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
/**
 *
 * @author Martin Rohwedder
 * @since 20-02-2013
 * @version 1.0
 */
public class ChakulaUserDetails implements UserDetails {

    private User user;
    private List<? extends GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();

    public ChakulaUserDetails(User user, List<? extends GrantedAuthority> authorities)         {
        this.user = user;
        this.authorities = authorities;
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return authorities;
    }

    @Override
    public String getPassword() {
        return this.user.getPassword();
    }

    @Override
    public String getUsername() {
        return this.user.getUsername();
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }

}
包dk.chakula.web.security;
导入dk.chakula.web.domain.User;
导入java.util.ArrayList;
导入java.util.Collection;
导入java.util.List;
导入org.springframework.security.core.GrantedAuthority;
导入org.springframework.security.core.userdetails.userdetails;
/**
*
*@作者马丁·罗威德
*@自2013年2月20日起
*@version 1.0
*/
公共类ChakulaUserDetails实现UserDetails{
私人用户;
私人名单

您可以查看GITHUB上我的Chakula项目的所有源代码,如果您需要它来帮助我-

我的Dao实现类似乎都失败了,因为当我显示AuthenticationException消息时,它告诉我以下内容-无法解析属性:用户名:dk.Chakula.web.domain.User[来自dk.chakula.web.domain.User u,其中u.USERNAME=:USERNAME]

我所要做的就是用非大写字母写u.USERNAME

我将安全上下文xml文件从登录标签身份验证失败url属性重写为以下值

 <security:form-login login-page="/login" default-target-url="/app/start" authentication-failure-url="/login/failure" username-parameter="username" password-parameter="password" always-use-default-target="true" />
下次我知道在冲入stackoverflow之前显示所有异常消息。虽然现在其他人可能会在将来从我的答案中受益


感谢Arun p Johny在这里帮助我。

您的
UserDetails服务是否返回了正确的用户?您是否检查了数据库中的密码加密?在
failure url
中,您可以使用
Exception ex=(AuthenticationException)request.getSession().getAttribute(WebAttributes.AUTHENTICATION\u Exception))
查找故障原因Urtanks Arun P Johny。似乎它可以提取该异常并显示消息。问题似乎出在我的UserDaoImpl类中,在该类中,我使用hibernate会话工厂从数据库提取和映射数据。异常消息是-无法解析属性:的用户名:dk.chakula.web.domain.User[来自dk.chakula.web.domain.User u,其中u.USERNAME=:USERNAME]-这是因为我用大写字母写了u.USERNAME。因此再次感谢您的帮助。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:security="http://www.springframework.org/schema/security"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
                       http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd">

    <security:http use-expressions="true">

        <!-- Form Login Filter -->
        <security:form-login login-page="/login" default-target-url="/app/start" authentication-failure-url="/login?authenticationNok=1" username-parameter="username" password-parameter="password" always-use-default-target="true" />

        <!-- Logout Filter -->
        <security:logout logout-success-url="/home?logoutOk=1" logout-url="/logout" invalidate-session="true" />

        <!-- Intercept Url filters -->
        <security:intercept-url pattern="/" access="permitAll" />
        <security:intercept-url pattern="/home" access="permitAll" />
        <security:intercept-url pattern="/about" access="permitAll" />
        <security:intercept-url pattern="/login" access="permitAll" />
        <security:intercept-url pattern="/resources/**" access="permitAll" />

        <security:intercept-url pattern="/app/**" access="fullyAuthenticated" />

    </security:http>

    <bean id="chakulaUserDetailsService" class="dk.chakula.web.security.ChakulaUserDetailsService" />

    <security:authentication-manager>
        <security:authentication-provider user-service-ref="chakulaUserDetailsService">
            <security:password-encoder hash="sha-256">
                <security:salt-source user-property="username" />
            </security:password-encoder>
            <!--
            <security:user-service>
                <security:user name="test" password="e9233bd61e14137a7e28f92c50ce279215e774a1772d1e9dad5f275b9cc8177c" authorities="ROLE_CUSTOMER" />
            </security:user-service>
            -->
        </security:authentication-provider>
    </security:authentication-manager>

</beans>
 <security:form-login login-page="/login" default-target-url="/app/start" authentication-failure-url="/login/failure" username-parameter="username" password-parameter="password" always-use-default-target="true" />
@RequestMapping(value = {"/login/failure"}, method = RequestMethod.GET)
public ModelAndView renderLoginFailureView(HttpServletRequest request) {
    ModelAndView mav = new ModelAndView("login");
    AuthenticationException authEx = (AuthenticationException) request.getSession().getAttribute(WebAttributes.AUTHENTICATION_EXCEPTION);

    mav.addObject("authEx", authEx.getMessage());
    return mav;
}