当前位置: 首页 > 知识库问答 >
问题:

如何将Spring启动身份验证与 Redis 会话一起使用

茹照
2023-03-14

我试图通过编写一个简单的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();
    }
}

共有1个答案

尹俊雅
2023-03-14

原来我忘记在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:成功登录并重定向到后,我被控制器的中间件踢回(