1. 程式人生 > >Spring Security 訪問控制-實現 RESTful API

Spring Security 訪問控制-實現 RESTful API

要想實現 Spring Security 返回 JSON 格式串,只需重寫以下幾個處理器(JavaConfig)

  • http.exceptionHandling().accessDeniedHandler()
  • http.exceptionHandling().authenticationEntryPoint()
  • http.formLogin().successHandler()
  • http.formLogin().failureHandler()
  • http.logout().logoutSuccessHandler()

最終實現的效果為:

//登入失敗(賬號不存在)
{"code":1,"message"
:"User is disabled"} //登入失敗(密碼錯誤) {"code":1,"message":"Bad credentials"} //登入成功 {"code":0,"message":"登入成功"} //訪問拒絕 {"code":1,"message":"Access is denied"} //登出成功 {"code":0,"message":"已登出"} //未經授權就訪問資源 {"code":1,"message":"Full authentication is required to access this resource"}

(1)build.gradle 新增專案依賴

compile 'org
.springframework.security:spring-security-web:4.2.3.RELEASE' compile group: 'org.springframework.security', name: 'spring-security-config', version: '4.2.3.RELEASE'

(2)訪問控制配置(JavaConfig):SecurityConfigurer《Filter, WebSecurity> 是 WebSecurityConfigurerAdapter 的父類,Spring Security 會在容器內尋找上述介面的實現類 Bean,因此只要我們新建一個派生類繼承 WebSecurityConfigurerAdapter 並注入容器內,就能被自動配置(經由被重寫的模板方法)

@Configuration
@Import(RootConfig.class)
public class GoWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {

    //......

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .exceptionHandling()
                    .accessDeniedHandler(new GoAccessDeniedHandler())
                    .authenticationEntryPoint(new GoAuthenticationEntryPoint())
                .and().authorizeRequests()
                    .antMatchers("/", "/csrf").permitAll()
                    .antMatchers("/hello").hasAuthority("ADMIN")
                    .anyRequest().authenticated()
                .and().formLogin()
                    .loginProcessingUrl("/login").permitAll()
                    .successHandler(new GoAuthenticationSuccessHandler())
                    .failureHandler(new GoAuthenticationFailureHandler())
                .and().logout()
                    .logoutUrl("/logout")
                    .logoutSuccessHandler(new GoLogoutSuccessHandler())
                    .invalidateHttpSession(true)
                    .deleteCookies("JSESSIONID")
                .and().requiresChannel()
                    .antMatchers("/pomer").requiresSecure()
                    .anyRequest().requiresInsecure()
                .and().rememberMe()
                    .tokenValiditySeconds(1800)
                    .key("token_key");
    }
}

GoAccessDeniedHandler

public class GoAccessDeniedHandler implements AccessDeniedHandler {

    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response,
                       AccessDeniedException exception) throws IOException, ServletException {
        response.setHeader("Content-Type", "application/json;charset=utf-8");
        response.getWriter().print("{\"code\":1,\"message\":\""+exception.getMessage()+"\"}");
        response.getWriter().flush();
    }
}

GoAuthenticationEntryPoint

public class GoAuthenticationEntryPoint implements AuthenticationEntryPoint {

    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response,
                         AuthenticationException exception) throws IOException, ServletException {
        response.setHeader("Content-Type", "application/json;charset=utf-8");
        response.getWriter().print("{\"code\":1,\"message\":\""+exception.getMessage()+"\"}");
        response.getWriter().flush();
    }
}

GoAuthenticationFailureHandler

public class GoAuthenticationFailureHandler implements AuthenticationFailureHandler {

    @Override
    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
                                        AuthenticationException exception) throws IOException, ServletException {
        response.setHeader("Content-Type", "application/json;charset=utf-8");
        response.getWriter().print("{\"code\":1,\"message\":\""+exception.getMessage()+"\"}");
        response.getWriter().flush();
    }
}

GoAuthenticationSuccessHandler

public class GoAuthenticationSuccessHandler implements AuthenticationSuccessHandler {

    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
                                        Authentication authentication) throws IOException, ServletException {
        response.setHeader("Content-Type", "application/json;charset=utf-8");
        response.getWriter().print("{\"code\":0,\"message\":\"登入成功\"}");
        response.getWriter().flush();
    }
}

GoLogoutSuccessHandler

public class GoLogoutSuccessHandler implements LogoutSuccessHandler {

    @Override
    public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response,
                                Authentication authentication) throws IOException, ServletException {
        response.setHeader("Content-Type", "application/json;charset=utf-8");
        response.getWriter().print("{\"code\":0,\"message\":\"已登出\"}");
        response.getWriter().flush();
    }
}

相關推薦

Spring Security 訪問控制-實現 RESTful API

要想實現 Spring Security 返回 JSON 格式串,只需重寫以下幾個處理器(JavaConfig) http.exceptionHandling().accessDeniedHandler() http.exceptionHandling().

使用Spring Security和OAuth2實現RESTful服務安全認證

schema repo gradle nbsp tps protect 一個 ndb lac 這篇教程是展示如何設置一個OAuth2服務來保護REST資源. 源代碼下載github. (https://github.com/iainporter/oauth2-provide

使用Spring Security和Thymeleaf實現訪問控制

引入相關依賴 <!--引入thymeleaf與Spring Security整合的依賴--> <dependency> <groupId>org.thymeleaf.extras</group

spring security 3.1 實現權限控制

ref bmi sage pan 管理系統 dao 數據庫 ng- nds spring security 3.1 實現權限控制 簡單介紹:spring security 實現的權限控制,能夠分別保護後臺方法的管理,url連接訪問的控制,以及頁面元

Spring Security 整合freemaker 實現簡單登入和角色控制

寫這篇文章是因為我做了一個電商網站專案,近期剛加上許可權控制。整個過程很簡單,在此給大家梳理一下,也算是自己對知識點的一個總結。 一、需求分析: 我們都知道,電商網站在許可權這一塊,有兩大塊內容:        1、使用者未登入,部分頁面拒絕訪問(

spring boot 實現Restful API

簡單幾步,實現Restful API: 1、引入相關的依賴: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spr

spring security oauth2.0 實現

規範 ppi basic final pre 代碼 處理 state 三方  oauth應該屬於security的一部分。關於oauth的的相關知識可以查看阮一峰的文章:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.htm

利用Django實現RESTful API

uri true ima login str blog http 文件中 pps 利用Django實現RESTful API  RESTful API現在很流行,這裏是它的介紹 理解RESTful架構和 RESTful API設計指南.按照Django的常規方法當然也可以實

使用Spring Security安全控制

Spring Java Spring Boot 準備工作 首先,構建一個簡單的Web工程,以用於後續添加安全控制,也可以用之前Chapter3-1-2做為基礎工程。若對如何使用Spring Boot構建Web應用,可以先閱讀《Spring Boot開發Web應用》一文。 Web層實現請求映射 @C

怎樣從外網訪問內網RESTful API

本地部署了RESTful API,只能在區域網內訪問,怎樣從外網也能訪問到本地的RESTful API呢?本文將介紹具體的實現步驟。 準備工作 部署並啟動RESTful API服務端 預設部署的RESTful API服務端埠是80。 實現步驟 下載並解壓holer軟體包 Holer軟體包:hole

Spring Security OAuth2 JWT實現SSO

 轉載務必說明出處:https://blog.csdn.net/LiaoHongHB/article/details/84032850      在這裡我們以一臺伺服器和2臺客戶端做測試,在客戶端1進行登陸之後,訪問客服端2的時候不需要進行登陸就可訪問(類

通過Django簡單實現RESTful API

RESTful是一種前後端分離、通過呼叫API介面來實現具體的功能。 在RESTFUl中,每個URL視為一個資源,客戶端通過http動詞,對伺服器資源進行操作。 關於RESTful的概念和原理更詳細的介紹,可以參考下面阮大師的這篇文章,講的非常透徹。連結地址: http://www.

【Myself-Security】SpringMVC 開發 RESTFul API

RestFul API 一般的API都是什麼樣子的呢? 查詢 /user/query?name=tom GET 詳情 /user/getInfo?id=1 GET 建立 /user/create?name=to

Springboot: Springboot + spring boot admin 監控 spring security許可權控制

Springboot admin 很好的提供了對Springboot的監控,但是不建議直接將admin整合到已有的專案中。於是我另起一個專案,考慮到不能讓所有人都能看到這些資料了,於是引入了spring security。   本次使用的是spring-boot-admin-s

Spring Security --- 許可權控制安全框架入門簡介

Spring Security — 許可權控制安全框架入門簡介 一、Spring Security簡介 Spring Security是一個能夠為基於Spring的企業應用系統提供宣告式的安全訪問控制解決方案的安全框架。它提供了一組可以在Spring應用上下文中

第六篇:Spring Boot整合Swagger2構建RESTful API文件

由於Spring Boot有快速開發、便捷部署等特性,所以很大一部分Spring Boot的使用者會用來構建RESTfulAPI。而我們構建RESTfulAPI的目的通常都是由於多終端的原因,這些終端會共用很多底層業務邏輯,因此我們會抽象出這樣一層來同時服務於多個移動端或者Web前端。

Spring Security --- 許可權控制安全框架入門簡 介

Spring Security --- 許可權控制安全框架入門簡 介2018年09月20日 20:54:42 sunny2429 閱讀數:17 Spring Security是一個能夠為基於Spring的企業應用系統提供宣告式的安全訪問控制解決方案的安全框架。它提供了一

Spring boot 使用Swagger2構建RESTful API文件

前言 SwaggerUI可以說是一個非常好用的API文件工具,是前後端分離開發模式下的必備工具、具體實現及部分乾貨知識如下 匯入依賴 <!-- RESTful APIs swagger2 --> <dependency> <

Spring Security會話控制(單使用者登入)

在專案開發過程中很難避免說單使用者登入系統,或者說對登入會話進行限制,例如說,只能兩臺機器登入使用者 那麼話不多說,直接看配置程式碼: XML配置 如果你想限制單個使用者訪問你的應用程式的能力。Spring Security通過後面簡單的配置馬

SSM整合系列之 實現RESTFul API

摘要:REST,即Representational State Transfer的縮寫。直接翻譯的意思是"表現層狀態轉化"。它是一種網際網路應用程式的API設計理念:URL定位資源,用HTTP動詞(GET,POST,DELETE,PUT)描述操作。本文將介紹Restful風格API在SS