SpringSide 3 採用 Spring Security 2.0,即 Acegi 2.0 更名而來。核心架構未變,配置命名空間簡化。
在 web.xml 僅配置一個代理 Filter(FilterChainProxy),真正的安全 Filter 作為 Spring Bean 管理,支援 AOP 與依賴注入。


ChannelProcessingFilter:強制 HTTPSHttpSessionContextIntegrationFilter:從 Session 取認證信息LogoutFilter:處理登出AuthenticationProcessingFilter:處理登入表單提交RememberMeProcessingFilter:記住我功能ExceptionTranslationFilter:異常轉向登入/拒絕頁(**必須配置**)

AuthenticationManagerProviderManager 遍歷 AuthenticationProvider(如 DaoAuthenticationProvider)DaoAuthenticationProvider 調用 UserDetailsService.loadUserByUsername() 獲取用戶詳情AccessDecisionManager 交給 AccessDecisionVoter(如 RoleVoter)投票框架不關心具體表結構(User-Role、User-Role-Authority 等),只要求返回 UserDetails 物件。
public class UserDetailServiceImpl implements UserDetailsService {
private UserManager userManager;
public UserDetails loadUserByUsername(String userName) {
User user = userManager.getUserByLoginName(userName);
if (user == null) throw new UsernameNotFoundException(userName + " 不存在");
List<GrantedAuthority> auths = new ArrayList<>();
for (Role role : user.getRoles()) {
for (Authority auth : role.getAuths()) {
auths.add(new GrantedAuthorityImpl(auth.getName())); // 需 ROLE_ 前綴
}
}
return new org.springframework.security.userdetails.User(
user.getLoginName(), user.getPassword(),
true, true, true, true, // enabled, accountNonExpired, credentialsNonExpired, accountNonLocked
auths.toArray(new GrantedAuthority[0]));
}
@Required public void setUserManager(UserManager userManager) { this.userManager = userManager; }
}
傳統繁瑣的 Filter Bean 定義被 <http> 命名空間取代:

Authentication(認證) 與 Authority(授權) 易混淆。若採用三層 User-Role-Authority 模型,RoleVoter 默認識別 ROLE_ 前綴會導致 Authority 名稱像 Role。建議自定義 Voter 或調整前綴策略,語義更清晰。