我正在尝试设置一个带有 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 中或通过该块记录任何内容时,将被忽略。所以我猜这些函数内部发生了一些我无法调试的事情。任何帮助表示赞赏。谢谢。 请注意,我不会使用模板,只是外部调用请求。
最后,我得到了导致明显 BadCredentials 异常的原因,但我将编写这些步骤以使上面的代码段功能正常/正确:
更改:
new UsernamePasswordAuthenticationToken(
userDetails,
request.getPassword(),
userDetails.getAuthorities()
);