使用Spring Boot理解认证和会话管理

3
我已经使用mongo db作为后端创建了一个spring boot项目。我想要确保用户在进行身份验证和授权时能够维护一定的内存会话(使用redis或Spring Session内置的某些功能)。 我已经阅读了很多教程,例如这个这个这个等等。
所有这些教程都要求您扩展WebSecurityConfigAdapter,配置HttpSecurity并提供UserDetailService。我按以下方式完成了这些操作。
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean
    public UserDetailsService userDetailsService(){
        return new StockUserDetailService();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/login/**").permitAll()
                .antMatchers("/logout/**").permitAll()
                .antMatchers("/admin/**").hasAuthority("ADMIN")
                .antMatchers("/broker/**").hasAnyAuthority("BROKER")
                .anyRequest().fullyAuthenticated();
    }

    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService());
    }
}

但是我不明白的是会话管理发生在哪里,用户应该使用什么url进行登录?如果我编写一个映射到/login的控制器,那么我的登录控制器中的操作应该是什么。我真的没有完整的图片。



更新

我尝试发布到/login。 我得到这个错误

{
"timestamp": 1494842451672,
"status": 403,
"error": "Forbidden",
"message": "Could not verify the provided CSRF token because your session was not found.",
"path": "/login"
}
1个回答

1
Spring会为您管理/login路由。您只需要发送带有用户凭据的POST请求即可。如果您想指定另一个登录URL,可以使用.loginProcessingUrl("/myCustomLoginUrl")。 对于UserDetailsService,您需要提供自己的实现,该实现实现了loadUserByUsername(String userName)方法,该方法从数据库或您正在使用的任何持久性存储中检索用户,并返回具有相应权限的org.springframework.security.core.userdetails.User。请参阅以下官方文档:https://spring.io/guides/gs/securing-web/

我尝试向“/login”发布内容,但是出现了禁止错误。请检查我的更新。 - Ashwin
这是一个CSRF令牌问题。您可以在表单中提供一个隐藏字段来提供CSRF令牌,或者使用.csrf().disable()在您的安全配置中禁用它。 - balag3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接