1

使用 Spring Session REST 示例,我很好奇是否可以进行以下流程: 1. 第一次,用户传递其凭据、用户名和密码。2. Spring Session 将生成一个令牌,将其放入 Redis 3. 下次用户请求一些资源时,它会传递其 tiken。我的问题是以下代码是硬编码的: code @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication().withUser("user").password("password").roles("USER"); } code`我怎样才能使它成为动态的?提前致谢。

4

1 回答 1

2

Spring Session 的工作独立于您选择的安全框架,因此答案取决于您要使用的安全框架。这意味着为您的用户选择用户名/密码完全独立于 Spring Session。

由于该问题与 Spring Session 无关,因此您应该查阅您选择的安全框架的文档。在本例中,它是 Spring Security,因此您可以查阅Spring Security 关于身份验证的文档

第一步是确定您要如何进行身份验证。

例如,如果你想使用 JDBC 身份验证,你可以使用类似下面的东西。

@Autowired
private DataSource dataSource;

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    auth
        .jdbcAuthentication()
            .dataSource(dataSource)
            .withDefaultSchema()
            .withUser("user").password("password").roles("USER").and()
            .withUser("admin").password("password").roles("USER", "ADMIN");
}

默认情况下jdbcAuthentication期望:

select username, password, enabled from users where username = ?

将返回用户名、密码以及该用户是否已启用。如果您喜欢使用 jdbcAuthentication() 上的属性,您可以自定义此查询。有关详细信息,请参阅 javadoc。

注意:理解这一点很重要,withDefaultSchema并且withUser实际上仅适用于内存数据库,因为它每次都会尝试添加模式和用户。在生产环境中,您的用户和架构应该使用其他机制(即liquibase)添加。

最灵活的选择是实现一个UserDetailsService. 然后,您可以以任何您想要的方式查找用户。例如:

@Service
public class UserRepositoryUserDetailsService implements UserDetailsService {
    private final UserRepository userRepository;

    @Autowired
    public UserRepositoryUserDetailsService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @Override
    public UserDetails loadUserByUsername(String username)
            throws UsernameNotFoundException {
        MyUser user = userRepository.findByEmail(username);
        if(user == null) {
            throw new UsernameNotFoundException("Could not find user " + username);
        }
        List<GrantedAuthority> authorities = convert(user.getRoles());
        return new User(user.getUsername(), user.getPassword(), authorities);
    }
}

然后,您可以使用以下方式对其进行配置:

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth, UserDetailsService userDetailsService) throws Exception {
    auth
        .userDetailsService(userDetailsService);
}

您可以在我的Spring Security 4 talk中找到使用 UserDetailsS​​ervice 的完整示例

于 2015-08-17T14:12:54.710 回答