Spring Security与使用React的Rest API
Spring Security与使用React的Rest API
我正在尝试使用Spring Security、Rest API和React作为前端实现。由于这是我第一个全栈开发项目,我对如何实现适当的身份验证机制一无所知。
我进行了很多搜索,并找到了关于使用Basic Auth的Spring Security文章,但我无法弄清楚如何将该身份验证转换为rest api,然后通过会话/cookie进行管理。即使我找到了一些GitHub参考资料,但它们要么非常陈旧,要么还没有完全迁移到Spring Security 5。
因此,无法确定保护rest api的正确方法。(是仅使用Spring Security,还是Spring Security + JWT,还是Spring Security + JWT + Spring Session + Cookie)
编辑
从数据库验证用户名
@Component CustomUserDetailsService -> loadUserByUsername -> Mongo Db
密码加密
@Bean public PasswordEncoder passwordEncoder() { ... }
跨域
@Bean public WebMvcConfigurer corsConfigurer() { ... }
注册控制器
@RestController public class RegistrationController { @PostMapping("/registration") @ResponseStatus(HttpStatus.CREATED) @ResponseBody public ResponseEntity registerUserAccount(... ) { ... } ]
Mongo会话
build.gradle implementation 'org.springframework.session:spring-session-data-mongodb' implementation 'org.springframework.boot:spring-boot-starter-data-mongodb' @Configuration @EnableMongoHttpSession
以上是我已经实施的内容。之后,我在如何保持用户会话和验证用户方面遇到了困难。
Spring Security与使用React的Rest API的问题是如何处理基本授权和JWT验证。 在基本授权中,前端应用程序在每次调用API时都必须发送用户凭据,并且需要处理跨域资源共享(CORS)。使用JWT验证可以提供更安全的身份验证,并且可以通过存储在HttpOnly cookie中的令牌来验证会话。
基本授权的解决方法是在前端应用程序的每个请求中包含授权头,并且在后端配置中验证这些凭据。同时,需要进行CORS配置以允许来自前端应用程序的跨域请求。
JWT验证的解决方法是创建一个身份验证端点,前端应用程序将用户凭据发送到该端点。后端将验证凭据并生成一个JWT令牌。该令牌将存储在HttpOnly cookie中,并在后续请求中使用。后端还需要添加一个自定义过滤器来验证请求中的令牌,并在通过验证后将用户标记为已验证。
在前端应用程序中,只需在每个请求中添加“credentials: 'include'”选项即可将cookie与请求一起发送。
通过这些解决方法,可以实现基本授权和JWT验证,从而提供更安全和可靠的身份验证机制。
Spring Security with Rest API with React的问题是如何在Spring Security和React中使用Rest API进行身份验证。这个问题出现的原因是作者想要在他的项目中实现前后端分离,并使用React作为前端,Spring Boot和Spring Security作为后端。以下是解决这个问题的步骤:
1. 在数据库中手动创建一个用户。
2. 在React登录页面中调用登录API:
const config = { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }; axios.post('http://localhost:9090/login',querystring.stringify( { username: username.value, password: password.value }),config).then(response => { setLoading(false); setUserSession(null, username.value); props.history.push('/landingpage'); })
3. 创建一个Spring Boot项目,其中包括:
- 创建一个POST的Rest API来处理登录请求。
- 在pom.xml文件中添加Spring Security的依赖。
- 创建一个实现UserDetailsService接口的类,用于从数据库获取用户详细信息并提供给Spring Security拦截器。
- 在配置文件中配置UserDetailsService类,以便Spring Security能够识别它。
- 在配置文件中继承WebSecurityConfigurerAdapter类,并根据自己的需求声明configure方法(可以在网上找到多个示例)。
这样就完成了,之后就可以使用Spring Security和React进行身份验证了。