放置我的自定义身份验证逻辑哪里更好?

时间:2016-06-07 16:04:44

标签: spring spring-security spring-boot

我想在Spring Boot中为我的身份验证添加一些逻辑,检查一个帐户是否有特定的逻辑,例如,如果其帐户中的日期在当前日期之前。

最好放在自定义过滤器或UserDetailsS​​ervice中的哪个位置?

如果它在过滤器中,最好从任何弹簧类扩展?

解释

正如您所见,我使用自定义userDetailsS​​ervice()来获取用户详细信息(CuentaUser),其中包含逻辑所需的字段(例如到期日期)。所以现在我需要添加逻辑,然后我可以在两个地方找到它:在UserDetailsS​​ervices中(如果逻辑失败则抛出异常)或者作为自定义过滤器。

将自定义验证逻辑放在哪里更好?

这是我的实际安全配置:

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进行检查。

1 个答案:

答案 0 :(得分:1)

您可以使用AuthenticationProvider并将登录信息放入其中。

@Component 公共类CustomAuthenticationProvider实现AuthenticationProvider {

你可以在这里看到更多:

http://www.baeldung.com/spring-security-authentication-provider