最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Security登錄接口兼容JSON格式登錄實(shí)現(xiàn)示例

 更新時間:2024年01月17日 09:40:19   作者:YYAugenstern  
前后端分離中,前端和后端的數(shù)據(jù)交互通常是JSON格式,本文主要介紹了Spring Security登錄接口兼容JSON格式登錄實(shí)現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下

1、概述

前后端分離中,前端和后端的數(shù)據(jù)交互通常是JSON格式,而Spring Security的登錄接口默認(rèn)支持的是form-data或者x-www-form-urlencoded的,如下所示:

那么如何讓Spring Security的登錄接口也支持JSON格式登錄呢?請看下文分析 

2、自定義過濾器

/**
 * @Author : 一葉浮萍?xì)w大海
 * @Date: 2024/1/13 9:30
 * @Description:
 */
public class MyUsernamePasswordAuthenticationFilter7007 extends UsernamePasswordAuthenticationFilter {

    @Override
    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
        if (!HttpMethod.POST.name().equals(request.getMethod())) {
            throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod());
        }
        String sessionCode = (String) request.getSession().getAttribute("code");
        if (MediaType.APPLICATION_JSON_VALUE.equals(request.getContentType()) || MediaType.APPLICATION_JSON_UTF8_VALUE.equals(request.getContentType())) {
            Map<String, String> loginData = new HashMap<>(16);
            try {
                loginData = new ObjectMapper().readValue(request.getInputStream(), Map.class);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                String paramCode = loginData.get("code");
                try {
                    checkCode(response,paramCode,sessionCode);
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }
            String username = loginData.get(getUsernameParameter());
            String password = loginData.get(getPasswordParameter());
            if (username == null) {
                username = "";
            }
            if (password == null) {
                password = "";
            }
            username = username.trim();
            UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password);
            setDetails(request,authRequest);
            return this.getAuthenticationManager().authenticate(authRequest);
        } else {
            try {
                checkCode(response,request.getParameter("code"),sessionCode);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
            return super.attemptAuthentication(request, response);
        }
    }

    /**
     * 檢查驗(yàn)證碼
     * @param response
     * @param paramCode
     * @param sessionCode
     */
    private void checkCode(HttpServletResponse response, String paramCode, String sessionCode) throws Exception {
        if (StringUtils.isBlank(paramCode)) {
            R r = R.error(ResponseEnum.VERIFY_CODE_IS_NULL.getCode(), ResponseEnum.VERIFY_CODE_IS_NULL.getMessage());
            response.setContentType("application/json;charset=utf-8");
            PrintWriter out = response.getWriter();
            out.write(new ObjectMapper().writeValueAsString(r));
            out.flush();
            out.close();
            return;
        }
        if (StringUtils.isBlank(sessionCode)) {
            R r = R.error(ResponseEnum.VERIFY_CODE_IS_EXPIRED.getCode(), ResponseEnum.VERIFY_CODE_IS_EXPIRED.getMessage());
            response.setContentType("application/json;charset=utf-8");
            PrintWriter out = response.getWriter();
            out.write(new ObjectMapper().writeValueAsString(r));
            out.flush();
            out.close();
            return;
        }
        if (!StringUtils.equals(paramCode.toLowerCase(), sessionCode.toLowerCase())) {
            R r = R.error(ResponseEnum.VERIFY_CODE_IS_NOT_MATCH.getCode(), ResponseEnum.VERIFY_CODE_IS_NOT_MATCH.getMessage());
            response.setContentType("application/json;charset=utf-8");
            PrintWriter out = response.getWriter();
            out.write(new ObjectMapper().writeValueAsString(r));
            out.flush();
            out.close();
            return;
        }
    }
}

3、配置類

/**
 * @Author : 一葉浮萍?xì)w大海
 * @Date: 2024/1/11 21:50
 * @Description: Spring Security配置類
 */
@Configuration
public class MyWebSecurityConfigurerAdapter7007 extends WebSecurityConfigurerAdapter {

    @Resource
    private MyAuthenticationSuccessHandler7007 successHandler;
    @Resource
    private MyAuthenticationFailureHandler7007 failureHandler;
    @Resource
    private MyLogoutSuccessHandler7007 logoutSuccessHandler;
    @Resource
    private MyAuthenticationEntryPoint7007 authenticationEntryPoint;
    @Resource
    private MyAccessDeniedHandler7007 accessDeniedHandler;
    @Resource
    private UserDetailsService userDetailsServiceImpl;

    /**
     * 密碼加密器
     *
     * @return
     */
    @Bean
    PasswordEncoder passwordEncoder() {
        return NoOpPasswordEncoder.getInstance();
    }

    /**
     * 定義基于MyBatis-Plus的用戶
     *
     * @return
     */
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsServiceImpl);
    }

    /**
     * 角色繼承
     *
     * @return
     */
    @Bean
    protected RoleHierarchy roleHierarchy() {
        RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
        roleHierarchy.setHierarchy("ROLE_admin > ROLE_dba");

        return roleHierarchy;
    }

    @Bean
    public MyUsernamePasswordAuthenticationFilter7007 usernamePasswordAuthenticationFilter() throws Exception {
        MyUsernamePasswordAuthenticationFilter7007 usernamePasswordAuthenticationFilter = new MyUsernamePasswordAuthenticationFilter7007();
        usernamePasswordAuthenticationFilter.setFilterProcessesUrl("/login");
        usernamePasswordAuthenticationFilter.setAuthenticationManager(authenticationManager());
        // 登錄成功回調(diào)
        usernamePasswordAuthenticationFilter.setAuthenticationSuccessHandler(successHandler);
        // 登錄失敗回調(diào)
        usernamePasswordAuthenticationFilter.setAuthenticationFailureHandler(failureHandler);
        return usernamePasswordAuthenticationFilter;

    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/dba/**").hasRole("dba")
                .antMatchers("/admin/**").hasRole("admin")
                .antMatchers("/helloWorld", "/verifyCode/getVerifyCode")
                .permitAll()
                .anyRequest()
                .authenticated()

                .and()

                /**
                 * 注銷登錄回調(diào)
                 */
                .logout()
                .logoutUrl("/logout")
                .logoutSuccessHandler(logoutSuccessHandler)
                .permitAll()

                .and()

                .csrf()
                .disable()

                /**
                 * 未認(rèn)證 & 權(quán)限不足回調(diào)
                 */
                .exceptionHandling()
                .authenticationEntryPoint(authenticationEntryPoint)
                .accessDeniedHandler(accessDeniedHandler);
        http.addFilterAfter(usernamePasswordAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
    }

}

4、測試

到此這篇關(guān)于Spring Security登錄接口兼容JSON格式登錄實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Spring Security登錄接口兼容JSON內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • Maven項(xiàng)目中使用本地jar包的兩種方法詳解

    Maven項(xiàng)目中使用本地jar包的兩種方法詳解

    這篇文章主要為大家詳細(xì)介紹了Maven項(xiàng)目中使用本地jar包的兩種方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2026-01-01
  • Spring事務(wù)原理解析

    Spring事務(wù)原理解析

    Spring事務(wù)有可能會提交,回滾、掛起、恢復(fù),所以Spring事務(wù)提供了一種機(jī)制,可以讓程序員來監(jiān)聽當(dāng)前Spring事務(wù)所處于的狀態(tài),這篇文章主要介紹了Spring底層事務(wù)原理,需要的朋友可以參考下
    2022-12-12
  • Spring Boot 中 controller層注解常用方法詳解

    Spring Boot 中 controller層注解常用方法詳解

    在 Spring Boot 中,@RestController 是一個用于處理 RESTful 風(fēng)格請求的組合注解,它結(jié)合了 @Controller 和 @ResponseBody,使得返回的對象直接轉(zhuǎn)換成 JSON 或 XML 格式,無需視圖解析,本文重點(diǎn)介紹Spring Boot 中 controller層注解常用方法,感興趣的朋友一起看看吧
    2025-10-10
  • SpringBoot Jpa 自定義查詢實(shí)現(xiàn)代碼詳解

    SpringBoot Jpa 自定義查詢實(shí)現(xiàn)代碼詳解

    這篇文章主要介紹了SpringBoot Jpa 自定義查詢實(shí)現(xiàn)代碼詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • Spring事務(wù)失效的一種原因關(guān)于this調(diào)用的問題

    Spring事務(wù)失效的一種原因關(guān)于this調(diào)用的問題

    這篇文章主要介紹了Spring事務(wù)失效的一種原因關(guān)于this調(diào)用的問題,本文給大家分享問題原因及解決辦法,通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-10-10
  • 別在Java代碼里亂打日志了,這才是正確的打日志姿勢

    別在Java代碼里亂打日志了,這才是正確的打日志姿勢

    這篇文章主要介紹了別在Java代碼里亂打日志了,這才是正確的打日志姿勢,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • SpringBoot JPA出現(xiàn)錯誤:No identifier specified for en解決方案

    SpringBoot JPA出現(xiàn)錯誤:No identifier specified&nb

    這篇文章主要介紹了SpringBoot JPA出現(xiàn)錯誤:No identifier specified for en解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • SpringBoot的SPI機(jī)制源碼解析

    SpringBoot的SPI機(jī)制源碼解析

    這篇文章主要為大家介紹了SpringBoot的SPI機(jī)制源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • JAVA 注解Annotation開發(fā)流程從原理到實(shí)戰(zhàn)應(yīng)用

    JAVA 注解Annotation開發(fā)流程從原理到實(shí)戰(zhàn)應(yīng)用

    本文詳細(xì)介紹了Java注解(Annotation)的核心概念、分類及在開發(fā)中的應(yīng)用價值,重點(diǎn)講解了注解在AOP、ORM、權(quán)限校驗(yàn)和單元測試等高級應(yīng)用場景中的使用方法,并提供了注解的最佳實(shí)踐建議和一個基于注解的權(quán)限校驗(yàn)框架的實(shí)戰(zhàn)案例
    2026-04-04
  • 詳解Java中String類的各種用法

    詳解Java中String類的各種用法

    Java中定義了String和StringBuffer兩個類來封裝對字符串的各種操作,存放于java.lang包中,是Java語言的核心類,提供了字符串的比較、查找、截取、大小寫轉(zhuǎn)換等操作,無需導(dǎo)入即可直接使用它們。讓我們來詳細(xì)了解它吧
    2021-11-11

最新評論

永康市| 沙雅县| 华池县| 安仁县| 达孜县| 灵台县| 南昌县| 普兰店市| 曲靖市| 若尔盖县| 宝坻区| 乌拉特前旗| 屏东县| 肃宁县| 海晏县| 都兰县| 鲁山县| 阜城县| 巩留县| 花垣县| 南靖县| 大化| 安陆市| 策勒县| 夏河县| 六枝特区| 罗源县| 洛隆县| 广平县| 宁强县| 徐汇区| 稻城县| 伊宁市| 建始县| 印江| 鞍山市| 新余市| 古丈县| 藁城市| 三亚市| 甘南县|