<!-- Spring security Filter -->
<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>
<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>
這個Filter會攔截所有的URL請求,并且對這些URL請求進(jìn)行Spring Security的驗證。
注意,springSecurityFilterChain這個名稱是由命名空間默認(rèn)創(chuàng)建的用于處理web安全的一個內(nèi)部的bean的id。所以你在你的Spring配置文件中,不應(yīng)該再使用這個id作為你的bean。
與Acegi的配置不同,Acegi需要自行聲明一個Spring的bean來作為Filter的實(shí)現(xiàn),而使用Spring Security后,無需再額外定義bean,而是使用<http>元素進(jìn)行配置。
通過擴(kuò)展Spring Security的默認(rèn)實(shí)現(xiàn)來進(jìn)行用戶和權(quán)限的管理
事實(shí)上,Spring Security提供了2個認(rèn)證的接口,分別用于模擬用戶和權(quán)限,以及讀取用戶和權(quán)限的操作方法。這兩個接口分別是:UserDetails和UserDetailsService。
public interface UserDetails extends Serializable {
GrantedAuthority[] getAuthorities();
String getPassword();
String getUsername();
boolean isAccountNonExpired();
boolean isAccountNonLocked();
boolean isCredentialsNonExpired();
boolean isEnabled();
}
GrantedAuthority[] getAuthorities();
String getPassword();
String getUsername();
boolean isAccountNonExpired();
boolean isAccountNonLocked();
boolean isCredentialsNonExpired();
boolean isEnabled();
}
public interface UserDetailsService {
UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException, DataAccessException;
}
UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException, DataAccessException;
}
非常清楚,一個接口用于模擬用戶,另外一個用于模擬讀取用戶的過程。所以我們可以通過實(shí)現(xiàn)這兩個接口,來完成使用數(shù)據(jù)庫對用戶和權(quán)限進(jìn)行管理的需求。在這里,我將給出一個使用Hibernate來定義用戶和權(quán)限之間關(guān)系的示例。