1 /** 2 * spring security 核心配置文件 3 */ 4 @Configuration 5 public class BrowerSecurityConfig extends WebSecurityConfigurerAdapter { 6 @Autowired 7 private AuthenticationManager authenticationManager; 8 @Autowired //自定義的安全元 數據源 實現FilterInvocationSecurityMetadataSource 9 private MyInvocationSecurityMetadataSourceService myInvocationSecurityMetadataSourceService; 10 @Autowired //自定義訪問決策器 11 private MyAccessDecisionManager myAccessDecisionManager; 12 13 @Override 14 protected void configure(HttpSecurity http) throws Exception { 15 /** 16 * from表單登錄設置 17 */ 18 http.formLogin() 19 .loginPage("") //登錄頁面 /login 20 .passwordParameter("") //設置form表單中對應的name參數 默認為 password 下同 21 .usernameParameter("") // 22 .defaultSuccessUrl("") //認證成功后的跳轉頁面 默認跳轉頁面 可以設置是否總是默認 不是的話可以跳轉與用戶的target-url 23 .failureUrl("") 24 .failureForwardUrl("") //登錄失敗 轉發 的url 25 .successForwardUrl("") //登錄成功 轉發 的url 與successHandler對應 即處理完后請求轉發的url 26 .failureHandler(null) //自定義的認證失敗 做什么處理 27 .successHandler(null) //自定義認證成功 后做的處理 ----- 例如 想記錄用戶信息判斷用戶狀態等 28 .permitAll() //對於需要所有用戶都可以訪問的界面 或者url進行設置 29 .loginProcessingUrl("") //自定義處理認證的url 默認為 /login 30 .authenticationDetailsSource(null) //自定義身份驗證的數據源 理解為查出數據庫中的密碼 和權限(可以不加) 然后再交給security 31 ////修改和替換配置 已經配置好的修改 例如下面修改 安全攔截器的安全數據源 32 .withObjectPostProcessor(new ObjectPostProcessor<FilterSecurityInterceptor>() { 33 public <O extends FilterSecurityInterceptor> O postProcess( 34 O fsi) { 35 fsi.setPublishAuthorizationSuccess(true); 36 //修改成自定義的 安全元數據源 權限的源 !!!!! 37 fsi.setSecurityMetadataSource(myInvocationSecurityMetadataSourceService); 38 //修改成自定義的 訪問決策器 自定義的 39 fsi.setAccessDecisionManager(myAccessDecisionManager); 40 //使用系統的 41 fsi.setAuthenticationManager(authenticationManager); 42 return fsi; 43 } 44 }); 45 /** 46 * 請求認證管理 47 */ 48 http.authorizeRequests() 49 .antMatchers("url匹配路徑").permitAll() //url匹配路徑 permitAll 運行 全部訪問 不用認證 50 .accessDecisionManager(null) //訪問決策器 51 .filterSecurityInterceptorOncePerRequest(true) //過濾每個請求一次的安全攔截器 ??? 52 .anyRequest().authenticated() //其他的請求 需要認證, 53 .antMatchers("/admin/**").hasRole("ADMIN") //url匹配路徑 具有怎樣的角色 54 .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')") //url匹配路徑 具有怎樣的角色 或者是權限 55 ; 56 /** 57 * anonymous 58 * 59 * 匿名訪問時 存在默認 用戶名 annonymousUser 60 */ 61 http.anonymous().disable().csrf().disable(); //禁止匿名 關閉csrf 62 /** 63 * 登出操作管理 64 */ 65 http.logout() //登出處理 66 .logoutUrl("/my/logout") 67 .logoutSuccessUrl("/my/index") 68 .logoutSuccessHandler(null) 69 .invalidateHttpSession(true) 70 .addLogoutHandler(null) 71 .deleteCookies("cookieNamesToClear") 72 ; 73 /** 74 * session 會話管理 75 */ 76 http.sessionManagement() //session管理 77 .maximumSessions(2) //最大session 數量 --用戶 78 .maxSessionsPreventsLogin(false) //超過最大sessin數量后時候阻止登錄 79 .expiredUrl("/") //會話失效后跳轉的url 80 .expiredSessionStrategy(null) //自定義session 過期錯略 81 .sessionRegistry(null) //自定義的session 注冊 表 82 ; 83 84 } 85 86 @Override 87 protected void configure(AuthenticationManagerBuilder auth) throws Exception { 88 /** 89 * 基礎的配置 90 */ 91 auth 92 /** 93 * 認證 時觸發的事件 94 */ 95 .authenticationEventPublisher(null) 96 /** 97 * 用戶細節服務 98 * 99 * 認證管理器數據的來源 吧 用戶身份憑證信息和 權限信息 100 */ 101 .userDetailsService(null) 102 /** 103 * 密碼編輯器 對密碼進行加密 104 */ 105 .passwordEncoder(null) 106 ; 107 } 108 109 @Bean 110 @Override 111 public AuthenticationManager authenticationManagerBean() throws Exception { 112 return super.authenticationManagerBean(); 113 } 114 115 @Override 116 public void configure(WebSecurity web) throws Exception { 117 /** 118 * 不進行攔截的mvc 119 */ 120 web.ignoring().mvcMatchers(); 121 /** 122 * 添加自定義的 安全過濾器 123 */ 124 web.addSecurityFilterChainBuilder(null); 125 } 126 }