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