我想在Spring Boot中为我的身份验证添加一些逻辑,检查一个帐户是否有特定的逻辑,例如,如果其帐户中的日期在当前日期之前。
最好放在自定义过滤器或UserDetailsService中的哪个位置?
如果它在过滤器中,最好从任何弹簧类扩展?
解释
正如您所见,我使用自定义userDetailsService()来获取用户详细信息(CuentaUser
),其中包含逻辑所需的字段(例如到期日期)。所以现在我需要添加逻辑,然后我可以在两个地方找到它:在UserDetailsServices中(如果逻辑失败则抛出异常)或者作为自定义过滤器。
将自定义验证逻辑放在哪里更好?
这是我的实际安全配置:
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private CuentaRepository accountRepository;
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService());
}
@Bean
public UserDetailsService userDetailsService() {
return (username) -> accountRepository.findByUsuario(username)
.map(a -> new CuentaUser(a, AuthorityUtils.createAuthorityList("USER", "write")))
.orElseThrow(() -> new UsernameNotFoundException("could not find the user '" + username + "'"));
}
@Override
protected void configure(HttpSecurity http) throws Exception {
CsrfTokenResponseHeaderBindingFilter csrfTokenFilter = new CsrfTokenResponseHeaderBindingFilter();
http.addFilterAfter(csrfTokenFilter, CsrfFilter.class);
http.authorizeRequests().anyRequest().authenticated().and().httpBasic();
}
}
编辑:我发现对于到期日期的例子,UserDetails有一个属性,所以最好使用它。无论如何,如果您不使用默认值,则需要使用自定义AuthenticationProvider进行检查。
答案 0 :(得分:1)
您可以使用AuthenticationProvider并将登录信息放入其中。
@Component 公共类CustomAuthenticationProvider实现AuthenticationProvider {
你可以在这里看到更多:
http://www.baeldung.com/spring-security-authentication-provider