基于Spring安全角色的独立认证系统授权

时间:2017-10-27 17:54:31

标签: java spring spring-mvc spring-security

我想使用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代码。

我可以让我的过滤器从请求中提取用户名并验证它。我只需要知道如何用我的过滤器完全替换基本的用户名/密码系统。

0 个答案:

没有答案