首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Spring Security 替換默認登錄過濾器為自定義 Controller 並保留授權流程的配置方案

     編輯:程式設計綜合問答
目標
禁用預設 UsernamePasswordAuthenticationFilter,使用自定義 Controller 處理登錄邏輯,認證成功後手動構建 Authentication 註入 SecurityContext,複用後續授權機制。

配置步驟

  1. 自定義登錄 Controller:
    @PostMapping("/login")
    public String login(@RequestParam String username, @RequestParam String password, HttpSession session) {
        // 1. 調用 UserDetailsService 加載用戶
        // 2. 密碼驗證(PasswordEncoder.matches)
        // 3. 構建 Authentication
        UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(userDetails, null, authorities);
        // 4. 註入 SecurityContext
        SecurityContextHolder.getContext().setAuthentication(auth);
        // 5. 可選:session 固化保護
        session.setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, SecurityContextHolder.getContext());
        return "redirect:/home";
    }
  2. Security 配置類:
    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .authorizeRequests()
                    .antMatchers("/login", "/css/**").permitAll()
                    .anyRequest().authenticated()
                .and()
                .formLogin() // 保留表單登錄入口但不使用默認處理
                    .loginPage("/login")
                    .loginProcessingUrl("/login") // 自定義 Controller 映射同一 URL
                    .successHandler((req, res, auth) -> { /* 可選 */ })
                .and()
                .logout().permitAll();
        }
    }
  3. 關鍵點:自定義 Controller 與 formLogin().loginProcessingUrl() 映射同一路徑,Spring Security 仍會攔截該請求,但委托給 Controller 處理;Controller 手動構建 Authentication 後,後續 FilterSecurityInterceptor 等授權過濾器正常工作。

總結

通過「自定義 Controller + 手動註入 Authentication」模式,既保留了 Spring Security 強大的授權體系(@PreAuthorize、方法級權限、ACL),又獲得了登錄頁面、驗證邏輯、多因子認證的完全控制權。

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