我正在尝试使用cookie会话设置一个基本的auth服务器。我将在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)
;
}
}
AuthController:
@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 or else内部的任何内容时,或通过该块时,都会被忽略。所以我猜这些函数中发生了一些我无法调试的事情。任何帮助都很感激。谢谢。注意,我不会使用模板,只是外部调用请求。
1条答案
按热度按时间nnvyjq4y1#
最后,我了解了导致明显的BadCredentials异常的原因,但我将编写步骤以使上面的代码片段正常工作/正确:
1.添加链方法“.and()”,后面跟着“.httpBasic()”。这还没有完成-它现在允许正确地使用用户名/密码进行身份验证,但在代码片段中有一个错误。
1.在创建'token'变量时,您必须传递请求密码输入。我注意到,只是因为我没有在任何地方使用传入的密码,我说:很明显,我需要与它进行比较。现在它工作正常。我希望这有助于在执行Spring Security Authentication时尝试跟踪403/401错误响应的困惑。
变更日期: