摘要:返回總共需要處理個地方,一個是異常的處理,需要兼容請求,一個是成功返回的處理,一個是失敗返回的處理。這里就是攔截,獲取提交的參數,然后交給去認證。之后就是走后續的,如果成功,則會進行相應的配置。動態配置權限筆記自定義
序
本文講述一下如何自定義spring security的登錄頁,網上給的資料大多過時,而且是基于后端模板技術的,講的不是太清晰,本文給出一個采用ajax的登錄及返回的前后端分離方式。
ajax返回ajax的異常處理總共需要處理3個地方,一個是異常的處理,需要兼容ajax請求,一個是成功返回的處理,一個是失敗返回的處理。
public class UnauthorizedEntryPoint implements AuthenticationEntryPoint { @Override public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { if(isAjaxRequest(request)){ response.sendError(HttpServletResponse.SC_UNAUTHORIZED,authException.getMessage()); }else{ response.sendRedirect("/login.html"); } } public static boolean isAjaxRequest(HttpServletRequest request) { String ajaxFlag = request.getHeader("X-Requested-With"); return ajaxFlag != null && "XMLHttpRequest".equals(ajaxFlag); } }
這里我們自定義成功及失敗的ajax返回,當然這里我們簡單處理,只返回statusCode
AjaxAuthSuccessHandlerpublic class AjaxAuthSuccessHandler extends SimpleUrlAuthenticationSuccessHandler { @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { response.setStatus(HttpServletResponse.SC_OK); } }AjaxAuthFailHandler
public class AjaxAuthFailHandler extends SimpleUrlAuthenticationFailureHandler { @Override public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException { response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Authentication failed"); } }security配置
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .exceptionHandling().authenticationEntryPoint(new UnauthorizedEntryPoint()) .and() .csrf().disable() .authorizeRequests() .antMatchers("/login","/css/**", "/js/**","/fonts/**").permitAll() .anyRequest().authenticated() .and() .formLogin() .loginPage("/login.html") .loginProcessingUrl("/login") .usernameParameter("name") .passwordParameter("password") .successHandler(new AjaxAuthSuccessHandler()) .failureHandler(new AjaxAuthFailHandler()) .permitAll() .and() .logout() .logoutUrl("/logout") .permitAll(); } @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth .inMemoryAuthentication() .withUser("admin").password("admin").roles("USER"); } }
這里有幾個要注意的點:
permitAll
這里要添加前端資源路徑,以及登陸表單請求的接口地址/login
loginPage
這里設置登錄頁面的地址,這里我們用靜態頁面,即static目錄下的login.html
ajax配置
將authenticationEntryPoint,successHandler,failureHandler設置為上面自定義的ajax處理類
登錄頁面就是一個純粹的html頁面,其中登錄按鈕的ajax請求如下:
$.ajax({ url: "/login", type: "POST", data: "name="+name+"&password="+password, success: function (res, status) { window.location.href="/ok.html" }, error: function (res, status) { dangerDialog(res.statusText); } });
spring security內置的各種filter:這里是請求/login,也就是spring security會默認攔截的路徑,不了解spring security的人可能會納悶,我請求這個路徑,但是工程里頭沒有定義/login的request mapping,不要緊么。下面來剖析一下。
Alias | Filter Class | Namespace Element or Attribute |
---|---|---|
CHANNEL_FILTER | ChannelProcessingFilter | http/intercept-url@requires-channel |
SECURITY_CONTEXT_FILTER | SecurityContextPersistenceFilter | http |
CONCURRENT_SESSION_FILTER | ConcurrentSessionFilter | session-management/concurrency-control |
HEADERS_FILTER | HeaderWriterFilter | http/headers |
CSRF_FILTER | CsrfFilter | http/csrf |
LOGOUT_FILTER | LogoutFilter | http/logout |
X509_FILTER | X509AuthenticationFilter | http/x509 |
PRE_AUTH_FILTER | AbstractPreAuthenticatedProcessingFilter Subclasses | N/A |
CAS_FILTER | CasAuthenticationFilter | N/A |
FORM_LOGIN_FILTER | UsernamePasswordAuthenticationFilter | http/form-login |
BASIC_AUTH_FILTER | BasicAuthenticationFilter | http/http-basic |
SERVLET_API_SUPPORT_FILTER | SecurityContextHolderAwareRequestFilter | http/@servlet-api-provision |
JAAS_API_SUPPORT_FILTER | JaasApiIntegrationFilter | http/@jaas-api-provision |
REMEMBER_ME_FILTER | RememberMeAuthenticationFilter | http/remember-me |
ANONYMOUS_FILTER | AnonymousAuthenticationFilter | http/anonymous |
SESSION_MANAGEMENT_FILTER | SessionManagementFilter | session-management |
EXCEPTION_TRANSLATION_FILTER | ExceptionTranslationFilter | http |
FILTER_SECURITY_INTERCEPTOR | FilterSecurityInterceptor | http |
SWITCH_USER_FILTER | SwitchUserFilter | N/A |
UsernamePasswordAuthenticationFilter這里我們要關注的就是這個UsernamePasswordAuthenticationFilter,顧名思義,它是filter,在執行/login請求的時候攔截,因而是不需要工程里頭去定義login的request mapping的。
spring-security-web-4.2.3.RELEASE-sources.jar!/org/springframework/security/web/authentication/UsernamePasswordAuthenticationFilter.java
public class UsernamePasswordAuthenticationFilter extends AbstractAuthenticationProcessingFilter { public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { if (postOnly && !request.getMethod().equals("POST")) { throw new AuthenticationServiceException( "Authentication method not supported: " + request.getMethod()); } String username = obtainUsername(request); String password = obtainPassword(request); if (username == null) { username = ""; } if (password == null) { password = ""; } username = username.trim(); UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken( username, password); // Allow subclasses to set the "details" property setDetails(request, authRequest); return this.getAuthenticationManager().authenticate(authRequest); } //...... }
doc這里就是攔截,獲取login.html提交的參數,然后交給authenticationManager去認證。之后就是走后續的filter,如果成功,則會進行相應的session配置。
spring security動態配置url權限
Spring Security筆記:自定義Login/Logout Filter、AuthenticationProvider、AuthenticationToken
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/11297.html
摘要:發現無效后,會返回一個的訪問拒絕,不過可以通過配置類處理異常來定制行為。惡意用戶可能提交一個有效的文件,并使用它執行攻擊。默認是禁止進行嗅探的。 前言 xss攻擊(跨站腳本攻擊):攻擊者在頁面里插入惡意腳本代碼,用戶瀏覽該頁面時,腳本代碼就會執行,達到攻擊者的目的。原理就是:攻擊者對含有漏洞的服務器注入惡意代碼,引誘用戶瀏覽受到攻擊的服務器,并打開相關頁面,執行惡意代碼。xss攻擊方式...
摘要:準備工作基本的配置就不說了,網上一堆例子,只要弄到普通的表單登錄和自定義就可以。是基于的,因此才能在基于前起作用。這樣我們沒有破壞原有的獲取流程,還是可以重用父類原有的方法來處理表單登錄。 spring security用了也有一段時間了,弄過異步和多數據源登錄,也看過一點源碼,最近弄rest,然后順便搭oauth2,前端用json來登錄,沒想到spring security默認居然不...
摘要:前言基于做微服務架構分布式系統時,作為認證的業內標準,也提供了全套的解決方案來支持在環境下使用,提供了開箱即用的組件。 前言 基于SpringCloud做微服務架構分布式系統時,OAuth2.0作為認證的業內標準,Spring Security OAuth2也提供了全套的解決方案來支持在Spring Cloud/Spring Boot環境下使用OAuth2.0,提供了開箱即用的組件。但...
摘要:寫在前面在一款應用的整個生命周期,我們都會談及該應用的數據安全問題。用戶的合法性與數據的可見性是數據安全中非常重要的一部分。 寫在前面 在一款應用的整個生命周期,我們都會談及該應用的數據安全問題。用戶的合法性與數據的可見性是數據安全中非常重要的一部分。但是,一方面,不同的應用對于數據的合法性和可見性要求的維度與粒度都有所區別;另一方面,以當前微服務、多服務的架構方式,如何共享Sessi...
摘要:在整個學習過程中,我最關心的內容有號幾點,其中一點是前后端分離的情況下如何不跳轉頁面而是返回需要的返回值。登錄成功,不跳轉頁面,返回自定義返回值在官方文檔第節,有這么一段描述要進一步控制目標,可以使用屬性作為的替代。 在整個學習過程中,我最關心的內容有號幾點,其中一點是【前后端分離的情況下如何不跳轉頁面而是返回需要的返回值】。下面就說一下學習結果,以xml配置位李。 登錄成功,不跳轉頁...
閱讀 2398·2021-11-23 09:51
閱讀 1209·2021-11-22 13:54
閱讀 3422·2021-09-24 10:31
閱讀 1066·2021-08-16 10:46
閱讀 3619·2019-08-30 15:54
閱讀 700·2019-08-30 15:54
閱讀 2886·2019-08-29 17:17
閱讀 3154·2019-08-29 15:08