国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

spring security ajax登錄及返回

ideaa / 1410人閱讀

摘要:返回總共需要處理個地方,一個是異常的處理,需要兼容請求,一個是成功返回的處理,一個是失敗返回的處理。這里就是攔截,獲取提交的參數,然后交給去認證。之后就是走后續的,如果成功,則會進行相應的配置。動態配置權限筆記自定義

本文講述一下如何自定義spring security的登錄頁,網上給的資料大多過時,而且是基于后端模板技術的,講的不是太清晰,本文給出一個采用ajax的登錄及返回的前后端分離方式。

ajax返回

總共需要處理3個地方,一個是異常的處理,需要兼容ajax請求,一個是成功返回的處理,一個是失敗返回的處理。

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

AjaxAuthSuccessHandler
public 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);
            }
        });

這里是請求/login,也就是spring security會默認攔截的路徑,不了解spring security的人可能會納悶,我請求這個路徑,但是工程里頭沒有定義/login的request mapping,不要緊么。下面來剖析一下。

spring security內置的各種filter:
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,顧名思義,它是filter,在執行/login請求的時候攔截,因而是不需要工程里頭去定義login的request mapping的。

UsernamePasswordAuthenticationFilter

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);
    }
    //......
}

這里就是攔截,獲取login.html提交的參數,然后交給authenticationManager去認證。之后就是走后續的filter,如果成功,則會進行相應的session配置。

doc

spring security動態配置url權限

Spring Security筆記:自定義Login/Logout Filter、AuthenticationProvider、AuthenticationToken

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/11297.html

相關文章

  • spring security安全防護

    摘要:發現無效后,會返回一個的訪問拒絕,不過可以通過配置類處理異常來定制行為。惡意用戶可能提交一個有效的文件,并使用它執行攻擊。默認是禁止進行嗅探的。 前言 xss攻擊(跨站腳本攻擊):攻擊者在頁面里插入惡意腳本代碼,用戶瀏覽該頁面時,腳本代碼就會執行,達到攻擊者的目的。原理就是:攻擊者對含有漏洞的服務器注入惡意代碼,引誘用戶瀏覽受到攻擊的服務器,并打開相關頁面,執行惡意代碼。xss攻擊方式...

    tuantuan 評論0 收藏0
  • Spring Security配置JSON登錄

    摘要:準備工作基本的配置就不說了,網上一堆例子,只要弄到普通的表單登錄和自定義就可以。是基于的,因此才能在基于前起作用。這樣我們沒有破壞原有的獲取流程,還是可以重用父類原有的方法來處理表單登錄。 spring security用了也有一段時間了,弄過異步和多數據源登錄,也看過一點源碼,最近弄rest,然后順便搭oauth2,前端用json來登錄,沒想到spring security默認居然不...

    adam1q84 評論0 收藏0
  • Spring Security OAuth2 優雅的集成短信驗證碼登錄第三方登錄

    摘要:前言基于做微服務架構分布式系統時,作為認證的業內標準,也提供了全套的解決方案來支持在環境下使用,提供了開箱即用的組件。 前言 基于SpringCloud做微服務架構分布式系統時,OAuth2.0作為認證的業內標準,Spring Security OAuth2也提供了全套的解決方案來支持在Spring Cloud/Spring Boot環境下使用OAuth2.0,提供了開箱即用的組件。但...

    yck 評論0 收藏0
  • 不用 Spring Security 可否?試試這個小而美的安全框架

    摘要:寫在前面在一款應用的整個生命周期,我們都會談及該應用的數據安全問題。用戶的合法性與數據的可見性是數據安全中非常重要的一部分。 寫在前面 在一款應用的整個生命周期,我們都會談及該應用的數據安全問題。用戶的合法性與數據的可見性是數據安全中非常重要的一部分。但是,一方面,不同的應用對于數據的合法性和可見性要求的維度與粒度都有所區別;另一方面,以當前微服務、多服務的架構方式,如何共享Sessi...

    toddmark 評論0 收藏0
  • spring security登錄、登出、認證異常返回值的自定義實現

    摘要:在整個學習過程中,我最關心的內容有號幾點,其中一點是前后端分離的情況下如何不跳轉頁面而是返回需要的返回值。登錄成功,不跳轉頁面,返回自定義返回值在官方文檔第節,有這么一段描述要進一步控制目標,可以使用屬性作為的替代。 在整個學習過程中,我最關心的內容有號幾點,其中一點是【前后端分離的情況下如何不跳轉頁面而是返回需要的返回值】。下面就說一下學習結果,以xml配置位李。 登錄成功,不跳轉頁...

    mushang 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<