如何使用spring data jpa存储库以编程方式验证用户?

时间:2015-04-07 14:30:52

标签: java spring-security spring-data-jpa

我使用spring数据审计创建演示项目。

我有spring-security.xml个文件:

<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
    http://www.springframework.org/schema/security
    http://www.springframework.org/schema/security/spring-security-4.0.xsd">

    <authentication-manager>            
        <authentication-provider ref="userDao" />
    </authentication-manager>

</beans:beans>

它指的是spring data jpa repository userDao

public interface UserDao extends CrudRepository<User, Long> {

    User findByUsernameAndPassword(String username, String password);
}

我希望spring数据jpa使用此方法来验证用户。

问题2是我需要以编程方式验证用户身份。 我尝试使用UserDetailsManager,但当我需要通过用户名和密码加载用户时,它只有loadByUsername方法。

如何使用UserDao.findByUsernameAndPassword方法以编程方式验证用户?

P.S。 User实体实现UserDetails接口。

1 个答案:

答案 0 :(得分:2)

我假设您使用的是从Spring Security getting started page

获取的基本配置

要以编程方式对用户进行身份验证,您需要将该用户置于安全上下文中。在您的具体情况下,它可能如下所示:

User user = userDao.findByUsernameAndPassword("username", "password");
SecurityContext ctx = SecurityContextHolder.createEmptyContext();
SecurityContextHolder.setContext(ctx);
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(user.getName(), user.getPassword(), AuthorityUtils.createAuthorityList("ROLE_USER"));
authentication.setDetails(user);
ctx.setAuthentication(authentication);