Spring Security許可權管理框架
Spring Security
Spring Security是作為過濾器控制權限的,在web.xml中配置過濾器。
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter -name>
<url-pattern>/*</url-pattern>
</filter-mapping>
定義security配置
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
public void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("bill").password("abc123").roles("USER");
auth.inMemoryAuthentication().withUser("dba").password("root123").roles("ADMIN","DBA");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/" , "/home").permitAll()
.antMatchers("/admin/**").access("hasRole('ADMIN')")
.antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')")
//使用and()新增新的配置選項
//登入頁設定為允許所有使用者訪問
.and().formLogin().loginPage("/login").permitAll()
.and().exceptionHandling().accessDeniedPage("/Access_Denied");
}
}
配置類需要@EnableWebSecurity、@EnableGlobalMethodSecurity、@EnableGlobalAuthentication中的一個標註。
access(“hasRole(‘ADMIN’)”) =access(“ROLE_ADMIN”)
configure()函式的配置對應XML為:
<http auto-config="true">
<intercept-url pattern="/*" access="ROLE_USER" />
<form-login login-page="/" default-target-url="/" authentication-failure-url="/? login=error" />
<logout logout-success-url="/" />
</http>
環境初始化
1.單獨使用spring security,需要將MySecurityConfig傳入並構造初始化Security環境的例項。該類自動將應用中的每個url註冊到SpringSecurityFilterChain,並且載入Security的配置。
public class SecurityWebApplicationInitializer
extends AbstractSecurityWebApplicationInitializer {
public SecurityWebApplicationInitializer() {
super(MySecurityConfig.class);
}
}
2.如果專案中使用了Spring,則專案中存在初始化Web環境的類,這時將Spring Security註冊到已經存在的ApplicationContext中。
import org.springframework.security.web.context.*;
public class SecurityWebApplicationInitializer
extends AbstractSecurityWebApplicationInitializer {
}
這個類將應用中的url註冊到SpringSecurityFilterChain。然後需要將MySecurityConfig載入到已經存在的程式上下文中。
public class SpringMvcInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { MySpringSecurityConfiguration.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return null;
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
Security中的類
Authentication
Authentication介面表示使用者認證資訊,使用者登入認證之前相關資訊會封裝為一個Authentication具體實現類的物件,登入認證後會生成一個包含使用者許可權的Authentication物件,並儲存在SecurityContextHolder的Context中。
//獲得使用者名稱
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
String username=((UserDetails) principal).getUsername();
AuthenticationManager
AuthenticationManager是一個用來處理認證(Authentication)請求的介面。在其中只定義了一個方法authenticate(),該方法只接收一個代表認證請求的Authentication物件作為引數,如果認證成功,則會返回一個封裝了當前使用者許可權等資訊的Authentication物件進行返回。
AuthenticationManager的預設實現是ProviderManager,但是它不直接自己處理認證請求,而是委託給其所配置的AuthenticationProvider列表,然後會依次使用每一個AuthenticationProvider進行認證,如果有一個AuthenticationProvider認證後的結果不為null,則表示該AuthenticationProvider已經認證成功,之後的AuthenticationProvider將不再繼續認證。如果所有的AuthenticationProvider的認證結果都為null,則表示認證失敗,將丟擲一個ProviderNotFoundException。
<authentication-manager>
//user-service-ref指定關聯哪個AuthenticationProvider,預設為DaoAuthenticationProvider
<authentication-provider user-service-ref="">
</authentication-provider>
</authentication-manager>
預設情況下,認證成功後ProviderManager將清除返回的Authentication中的憑證資訊(密碼等),因此無法直接將Authentication快取用於以後的登入認證。一種辦法是設定ProviderManager的eraseCredentialsAfterAuthentication屬性為false。