我有一个我在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
方法。
答案 0 :(得分:1)
您需要AuthenticationProvider
进行身份验证,实施AuthenticationProvider
并覆盖authentication
和supports
方法,然后注入AuthenticationManager
。< / p>
过滤器中的
attemptAuthentication
方法通常是获取authentication
(例如UsernamePasswordFilter
从请求中获取username
和password
,然后构建UsernamePasswordAuthenticationToken
}到AuthenticationManager
),
supports
方法测试AuthenticationProvider
是否可用于进行身份验证。(例如DaoAuthenticationProvider
支持UsernamePasswordAuthenticationToken
)
authenticate
方法用于进行身份验证(例如DaoAuthenticationProvider
通过用户名获取真实密码,然后与用户输入进行比较),此方法应返回已经过身份验证的Authentication
(例如UsernamePasswordAuthenticationToken
),此身份验证应包含用户权限(可用于hasRole('xxx')
),或使用详细信息等。
attemptAuthentication
成功后,Authentication
将设为SecurityContextHolder
。然后你可以使用hasRole('xx')
或其他东西。