首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

SpringSide 3 安全框架深度解析:Spring Security 2.0 (Acegi) 整合實戰

     編輯:Java 相關知識

背景釐清

SpringSide 3 採用 Spring Security 2.0,即 Acegi 2.0 更名而來。核心架構未變,配置命名空間簡化。

Acegi/Spring Security 核心架構

Filter 鏈保護 Web 資源

在 web.xml 僅配置一個代理 Filter(FilterChainProxy),真正的安全 Filter 作為 Spring Bean 管理,支援 AOP 與依賴注入。

Filter 代理架構

常用 Filter(按執行順序)

核心 Filter

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

認證與授權核心流程

認證授權管理器 Provider 與 Voter UserDetailsService

  1. Filter 將認證請求委派給 AuthenticationManager
  2. ProviderManager 遍歷 AuthenticationProvider(如 DaoAuthenticationProvider)
  3. DaoAuthenticationProvider 調用 UserDetailsService.loadUserByUsername() 獲取用戶詳情
  4. 授權決策由 AccessDecisionManager 交給 AccessDecisionVoter(如 RoleVoter)投票

開發者只需實現 UserDetailsService

框架不關心具體表結構(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; }
}

Spring Security 2.0 簡化配置:<http> 元素

傳統繁瑣的 Filter Bean 定義被 <http> 命名空間取代:

SpringSide 3 安全配置 傳統 vs 簡化對應

命名建議

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

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved