Spring Boot - 安全性 - 如何在身份验证工作流中添加预身份验证规则

时间:2017-11-13 20:16:58

标签: spring authentication spring-boot spring-security

我正在运行使用OAuth2保护的Spring Boot REST API。

这是我对访问令牌的需求的实际工作100%配置&刷新令牌:

@Configuration
public class ServerSecurityConfig extends GlobalAuthenticationConfigurerAdapter {

    @Autowired
    CustomPasswordEncoder passwordEncoder;

    @Autowired
    CustomUserDetailsService userDetailsService;

    @Override
    public void init(AuthenticationManagerBuilder auth) throws Exception {        
        auth
            .userDetailsService(userDetailsService)
            .passwordEncoder(passwordEncoder);
    }
}

我现在需要添加预身份验证配置,因此只有在某些配置可用时才能登录。

如果我需要覆盖AuthenticationManagerAuthenticationProvider

,我感到很困惑

我尝试在上面的同一个类中添加这样的CustomAuthenticationProvider:

@Override
public void init(AuthenticationManagerBuilder auth) throws Exception {
    // @formatter:off
    auth
        .authenticationProvider(authProvider)
        .userDetailsService(userDetailsService)
        .passwordEncoder(passwordEncoder);
    // @formatter:on
}

然后:

@Component
public class CustomAuthenticationProvider implements AuthenticationProvider {

    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        if (allowLogin()) {
            // Should call the UserDetailService as normally workflow.
            return null;
        }
        throw new AuthenticationServiceException("Out of service");
    }

    private boolean allowLogin() {
        //Custom logic            
        return false;
    }

    @Override
    public boolean supports(Class<?> authentication) {
        return authentication.equals(UsernamePasswordAuthenticationToken.class);
    }
}

但是当我抛出异常时,无论如何都会触发我的UserDetailService。所以这不是一个选择,或者我可能以错误的方式实施。

如何实现CustomAuthenticationManager?我不知道在哪里打电话。

我试图避免在UserDetailService的loadByUsername方法中抛出异常,因为如果有人已经有了令牌,那么他仍然可以使用我的API。也许我必须在两个过程中创建逻辑?

已更新

我认为我需要做的是添加CustomAccessDecisionVoter,但不知道资源服务器的配置位置。

1 个答案:

答案 0 :(得分:0)

您是否考虑过编写自定义userDetailsS​​ervice来装饰当前的UserDetailsS​​ervice并覆盖 loadUserByUsername 方法并返回UserDetails并使用&#39; ANONYMOUS&#39;角色并且不允许具有该角色的用户访问您的应用

public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    UserDetails user = userRolesManager.loadUserByUsername(username);
    if(allowLogin()){
        return user;
    }else{
        return new User(username, "notUsed", true, true,true,true, AuthorityUtils.createAuthorityList("ROLE_ANONYMOUS"));
    }
}