我正在运行使用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);
}
}
我现在需要添加预身份验证配置,因此只有在某些配置可用时才能登录。
如果我需要覆盖AuthenticationManager
或AuthenticationProvider
我尝试在上面的同一个类中添加这样的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
,但不知道资源服务器的配置位置。
答案 0 :(得分:0)
您是否考虑过编写自定义userDetailsService来装饰当前的UserDetailsService并覆盖 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"));
}
}