我想使用Spring Security的@PreAuthorize("hasAnyRole('ADMIN')")
注释来保护我的API,但是,我必须使用我公司的集中身份验证系统,而不是让用户通过Spring登录 - 安全
要明确这意味着什么:
我有权访问的是用户与角色的映射,因此我已根据this tutorial实施了自定义UserDetailsService
。
@Service
public class CustomUserDetailsService implements UserDetailsService {
@Autowired
private UsersRepository usersRepository;
@Override
public UserDetails loadUserByUsername(final String username) throws UsernameNotFoundException {
Optional<Users> optionalUsers = usersRepository.findByUserId(username);
optionalUsers
.orElseThrow(() -> new UsernameNotFoundException("Username not found"));
return optionalUsers
.map(CustomUserDetails::new).get();
}
}
并在配置文件中将其注入Spring Security:
@EnableGlobalMethodSecurity(prePostEnabled = true)
@EnableWebSecurity
@EnableJpaRepositories(basePackageClasses = UsersRepository.class)
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
private CustomUserDetailsService userDetailsService;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService);
http.addFilterAt(
new TrivialFilter(), BasicAuthenticationFilter.class);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("**/secured/**").authenticated().anyRequest().permitAll().and().formLogin()
.permitAll();
}
}
这非常有效。它成功评估了用户角色,并根据@PreAuthorize
注释允许/拒绝访问。我甚至在Servlet过滤器链中添加了一个过滤器,我最终可以用它来验证身份验证。 (现在它只记录并调用chain.doFilter(req, res)
。)
那么我如何阻止Spring-Security要求输入密码,同时保持其他好东西不变?
看来,如果删除HttpSecurity.authorizeRequests()
方法链的任何部分,虽然它可能会禁用登录屏幕,但对于任何带有@PreAuthorize
注释的方法,它只会假设未经授权用户。请求无法访问CustomUserDetailsService
类。 (虽然它仍然通过TrivialFilter
类。)它只响应403代码。
我可以让我的过滤器从请求中提取用户名并验证它。我只需要知道如何用我的过滤器完全替换基本的用户名/密码系统。