使用Spring Security进行授权和身份验证

时间:2016-12-25 08:15:20

标签: java spring authentication spring-security authorization

我有一个我在Spring之上构建的Web服务。我目前正在使用Spring Security进行身份验证,如下所示:

@Configuration
@EnableGlobalMethodSecurity(securedEnabled=true)
@EnableWebSecurity

public class ServerSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private Properties properties;

    private static final String ALL_URI = "/v1/**";
    private static final String HEALTH_URI = "/v1/healthCheck";

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.addFilterBefore(getFilter(), BasicAuthenticationFilter.class);
        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        http.authorizeRequests()
                .antMatchers(HEALTH_URI).permitAll()
                .anyRequest().authenticated();
        http.csrf().disable();
    }

    private AuthenticationFilter getFilter() {
        return new AuthenticationFilter( properties.getKey());
    }
}

我的AuthenticationFilter类扩展AbstractAuthenticationProcessingFilter并执行实际身份验证。如果我想将Authorization添加到我的安全性中,我是否只需要在AuthenticationFilter的attemptAuthentication方法中进行这些检查?或者有更好的方法吗?我理解的方式是授权和身份验证应该独立完成。首先进行身份验证,然后验证权限。因此,我认为在Spring Security中进行授权会有更好的方法,而不是仅仅将其添加到attemptAuthentication方法。

1 个答案:

答案 0 :(得分:1)

您需要AuthenticationProvider进行身份验证,实施AuthenticationProvider并覆盖authenticationsupports方法,然后注入AuthenticationManager。< / p> 过滤器中的

attemptAuthentication方法通常是获取authentication(例如UsernamePasswordFilter从请求中获取usernamepassword,然后构建UsernamePasswordAuthenticationToken }到AuthenticationManager),

supports方法测试AuthenticationProvider是否可用于进行身份验证。(例如DaoAuthenticationProvider支持UsernamePasswordAuthenticationToken

authenticate方法用于进行身份验证(例如DaoAuthenticationProvider通过用户名获取真实密码,然后与用户输入进行比较),此方法应返回已经过身份验证的Authentication (例如UsernamePasswordAuthenticationToken),此身份验证应包含用户权限(可用于hasRole('xxx')),或使用详细信息等。

attemptAuthentication成功后,Authentication将设为SecurityContextHolder。然后你可以使用hasRole('xx')或其他东西。