我试图通过编写一个简单的REST应用程序来学习Spring Boot,该应用程序将登录用户(POST /login
)并显示当前用户的信息(GET/
)。我正在使用Redis进行会话。
POST /login
按预期工作:它返回主体并在浏览器和Redis中设置会话cookie。
然而,随后的GET/
请求返回匿名用户
。我错过了什么?
pom.xml
:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
应用程序属性
:
spring.session.store-type=redis
server.servlet.session.timeout=3600s
spring.session.redis.flush-mode=on-save
spring.session.redis.namespace=spring:session
spring.redis.host=localhost
spring.redis.port=6379
< code > index controller . Java :
@Controller
public class IndexController {
private AuthenticationManager authenticationManager;
IndexController(AuthenticationManager authenticationManager) {
this.authenticationManager = authenticationManager;
}
@GetMapping
ResponseEntity index(HttpServletRequest request, HttpSession session) {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
return new ResponseEntity<>(authentication.getPrincipal(), HttpStatus.OK);
}
@PostMapping("/login")
ResponseEntity login(@RequestBody LoginRequest loginRequest) {
String username = loginRequest.getUsername();
String password = loginRequest.getPassword();
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, password);
Authentication authentication = this.authenticationManager.authenticate(token);
return new ResponseEntity<>(authentication.getPrincipal(), HttpStatus.OK);
}
}
配置.java
:
@EnableGlobalMethodSecurity(prePostEnabled = true)
@EnableWebSecurity
@EnableRedisHttpSession
@Configuration
public class Config extends WebSecurityConfigurerAdapter {
@Autowired
private CustomUserDetailsService userDetailsService;
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.ALWAYS)
.and()
.csrf()
.disable()
.authorizeRequests()
.anyRequest()
.permitAll();
}
}
原来我忘记在login
方法中设置身份验证
。这是正确的代码。
@PostMapping("/login")
ResponseEntity login(@RequestBody LoginRequest loginRequest) {
String username = loginRequest.getUsername();
String password = loginRequest.getPassword();
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, password);
Authentication authentication = this.authenticationManager.authenticate(token);
// vvv THIS vvv
SecurityContextHolder
.getContext()
.setAuthentication(authentication);
return new ResponseEntity<>(authentication.getPrincipal(), HttpStatus.OK);
}
请参阅 https://docs.spring.io/spring-security/site/docs/5.0.5.RELEASE/reference/htmlsingle/#what-is-authentication-in-spring-security
在身份验证等情况下,与会话相比,使用JWTs有什么优势? 它是作为独立方法使用还是在会话中使用?
我正在尝试根据Laravel5.3中的API对用户进行身份验证。它不起作用。一旦用户在登录后重定向,身份验证就不会持久。 路由配置如下: 在LoginController.php我正在使用 成功保存在文件中的登录后,路由的会话不会启动。 所以在路径上:
我正在使用spring security 5和spring boot 2.0.0 我有一个测试配置文件。 我有springBootApplication文件。 安全日志在下面
在过去的几天里,我一直在到处寻找如何做到这一点,最终决定承认失败并寻求帮助,请!!! 我遵循了Dave Syer博士关于Angular和Spring Security性的教程,特别是将Zuul代理用作api网关,并使用Redis的Spring会话(https://github.com/spring-guides/tut-spring-security-and-angular-js/tree/mas
我有一个Grails 2.5.3应用程序,目前使用Spring Security插件进行身份验证。用户使用用户名/pwd登录。 我现在更新了应用程序,以支持OAuth身份验证(使用ScribeJava)。用户可以单击将他们重定向到OAuth providers页面的链接,在成功输入凭据后,他们将被重定向回我的应用程序。但是,我无法将此功能与spring security plugin绑定在一起,这
TL;DR:成功登录并重定向到后,我被控制器的中间件踢回(