使用 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`我怎样才能使它成为动态的?提前致谢。
1 回答
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中找到使用 UserDetailsService 的完整示例。