无法使用 Spring Security 传递 403 禁止错误代码

问题描述 投票:0回答:1

我正在尝试设置一个带有 cookie 会话的基本身份验证服务器。我将使用 Java 和 Spring 从客户端与该服务进行通信。现在,问题是我无法通过基本登录端点,但我返回了一个 cookie 集“SESSION”,但带有路径“/login”的 403 禁止代码。 cookie 数据正确存储在我的 Postgres 数据库中(因为我使用的是 JDBC 身份验证策略)。我不明白如何进行,因为我无法在内部记录/调试这些功能以查看发生了什么。

安全配置:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Bean
    @Override
    public UserDetailsService userDetailsServiceBean() throws Exception {
        return super.userDetailsServiceBean();
    }

    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

    @Autowired
    private DataSource dataSource;

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Override
    public void configure(AuthenticationManagerBuilder auth)
        throws Exception {
        auth
            .jdbcAuthentication()
            .dataSource(dataSource)
            .passwordEncoder(passwordEncoder())
            .usersByUsernameQuery("""
                    SELECT username, password, enabled
                    FROM users
                    WHERE username=?
                """)
            .authoritiesByUsernameQuery("""
                    SELECT u.username, a.authority
                    FROM users u, authorities a
                    WHERE u.username=? AND a.username=u.username
                """)
        ;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .cors().and().csrf().disable()
            .authorizeRequests()
                .antMatchers("/auth/**").permitAll()
                .antMatchers("/users/**").authenticated()
            .and()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
            ;

    }

}

授权控制器:

@RequestMapping("/auth")
@RestController
@RequiredArgsConstructor
@Slf4j
public class AuthController {
    private final UserRepository userRepository;
    private final UserService userService;

    private final UserDetailsService userDetailsService;
    private final AuthenticationManager authenticationManager;

    @PostMapping("/login")
    ResponseEntity login(@RequestBody LoginRequest request) {
        var userDetails = userDetailsService.loadUserByUsername(request.getUsername());
        var token = new UsernamePasswordAuthenticationToken(
            userDetails,
            userDetails.getPassword(),
            userDetails.getAuthorities()
        );

        authenticationManager.authenticate(token);
        if (token.isAuthenticated()) {
            SecurityContextHolder.getContext().setAuthentication(token);
        }

        return ResponseEntity.ok("Logged");
    }

    @Data
    private static class LoginRequest {
        private Long id;
        private String username, password;
    }

}

在“authenticationManager.authenticate(token)”之前,我可以正确记录 userService 的权限/角色。然后,使用 token.isAuthenticated,当尝试在 if 或 else 中或通过该块记录任何内容时,将被忽略。所以我猜这些函数内部发生了一些我无法调试的事情。任何帮助表示赞赏。谢谢。 请注意,我不会使用模板,只是外部调用请求。

spring spring-boot authentication spring-security spring-jdbc
1个回答
0
投票

最后,我得到了导致明显 BadCredentials 异常的原因,但我将编写这些步骤以使上面的代码段功能正常/正确:

  1. 添加链方法“.and()”,后跟“.httpBasic()”。 这还没有完成——它现在允许使用用户名/密码进行正确的身份验证,但是在代码片段中有一个错误。
  2. 创建'token'变量时,您必须传递请求密码输入。我注意到只是因为我没有在任何地方使用传入密码,我说:好吧,很明显我需要实际比较它。 现在它工作正常。我希望这有助于在执行 Spring Security Authentication 时尝试遵循 403/401 错误响应的困惑。

更改:

new UsernamePasswordAuthenticationToken(
            userDetails,
            request.getPassword(),
            userDetails.getAuthorities()
);
© www.soinside.com 2019 - 2024. All rights reserved.