[英]Authorization and Authentication with Spring Security
我有一個基於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
方法中。
您需要AuthenticationProvider
進行身份驗證,實現AuthenticationProvider
並覆蓋authentication
和supports
方法,然后注入AuthenticationManager
。
過濾器中的attemptAuthentication
方法通常用於獲取authentication
(例如, UsernamePasswordFilter
從請求中獲取username
和password
,然后為AuthenticationManager
構建UsernamePasswordAuthenticationToken
),
supports
方法測試AuthenticationProvider
是否可用於進行身份驗證。(例如DaoAuthenticationProvider
支持UsernamePasswordAuthenticationToken
)
authenticate
方法用於進行身份驗證(例如, DaoAuthenticationProvider
通過用戶名獲取真實密碼,然后與用戶輸入進行比較),該方法應返回已通過Authentication
(例如UsernamePasswordAuthenticationToken
),並且此身份驗證應包含用戶權限(此可以用於hasRole('xxx')
),或使用詳細信息等。
attemptAuthentication
Authentication
成功后, Authentication
將設置為SecurityContextHolder
。 然后可以使用hasRole('xx')
或其他方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.