1. 程式人生 > >SpringBoot+SpringSecurity+Druid解決CSRF開啟問題

SpringBoot+SpringSecurity+Druid解決CSRF開啟問題

SpringBoot+Druid整合配置如下

1、pom中引入依賴

<!-- Druid 資料連線池依賴 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.0.27</version>
</dependency>

2、yml中配置資料來源

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://xx.xx.xx.xx:3306/xxx?useUnicode=true&characterEncoding=utf-8
    username: root
    password: xxxxxxxx
    type: com.alibaba.druid.pool.DruidDataSource
    # 下面為連線池的補充設定,應用到上面所有資料來源中
    # 初始化大小,最小,最大
    initialSize: 20
    minIdle: 20
    maxActive: 100
    # 配置獲取連線等待超時的時間
    maxWait: 60000
    # 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連線,單位是毫秒
    timeBetweenEvictionRunsMillis: 60000
    # 配置一個連線在池中最小生存的時間,單位是毫秒
    minEvictableIdleTimeMillis: 30000
    validationQuery: SELECT 1 FROM DUAL
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    # 開啟PSCache,並且指定每個連線上PSCache的大小
    poolPreparedStatements: true
    maxPoolPreparedStatementPerConnectionSize: 20
    # 配置監控統計攔截的filters,去掉後監控介面sql無法統計,'wall'用於防火牆
    filters: stat,wall,slf4j
    # 通過connectProperties屬性來開啟mergeSql功能;慢SQL記錄
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
    # 合併多個DruidDataSource的監控資料
    #useGlobalDataSourceStat: true

以上配置根據自己的需要修改

3、配置監控系統(此處有兩種方法,這裡只介紹一種,因為我不喜歡在主類上加太多東西。。。)

使用程式碼註冊Servlet

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import javax.sql.DataSource;
import java.sql.SQLException;

@Configuration
public class DruidConfiguration {

    private static final Logger logger = LoggerFactory.getLogger(DruidConfiguration.class);

    @Value("${spring.datasource.url}")
    private String dbUrl;
    @Value("${spring.datasource.username}")
    private String username;
    @Value("${spring.datasource.password}")
    private String password;
    @Value("${spring.datasource.driver-class-name}")
    private String driverClassName;
    @Value("${spring.datasource.initialSize}")
    private int initialSize;
    @Value("${spring.datasource.minIdle}")
    private int minIdle;
    @Value("${spring.datasource.maxActive}")
    private int maxActive;
    @Value("${spring.datasource.maxWait}")
    private int maxWait;
    @Value("${spring.datasource.timeBetweenEvictionRunsMillis}")
    private int timeBetweenEvictionRunsMillis;
    @Value("${spring.datasource.minEvictableIdleTimeMillis}")
    private int minEvictableIdleTimeMillis;
    @Value("${spring.datasource.validationQuery}")
    private String validationQuery;
    @Value("${spring.datasource.testWhileIdle}")
    private boolean testWhileIdle;
    @Value("${spring.datasource.testOnBorrow}")
    private boolean testOnBorrow;
    @Value("${spring.datasource.testOnReturn}")
    private boolean testOnReturn;
    @Value("${spring.datasource.poolPreparedStatements}")
    private boolean poolPreparedStatements;
    @Value("${spring.datasource.maxPoolPreparedStatementPerConnectionSize}")
    private int maxPoolPreparedStatementPerConnectionSize;
    @Value("${spring.datasource.filters}")
    private String filters;
    @Value("{spring.datasource.connectionProperties}")
    private String connectionProperties;

    @Bean     //宣告其為Bean例項
    @Primary  //在同樣的DataSource中,首先使用被標註的DataSource
    public DataSource dataSource(){
        DruidDataSource datasource = new DruidDataSource();
        datasource.setUrl(this.dbUrl);
        datasource.setUsername(username);
        datasource.setPassword(password);
        datasource.setDriverClassName(driverClassName);

        //configuration
        datasource.setInitialSize(initialSize);
        datasource.setMinIdle(minIdle);
        datasource.setMaxActive(maxActive);
        datasource.setMaxWait(maxWait);
        datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
        datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
        datasource.setValidationQuery(validationQuery);
        datasource.setTestWhileIdle(testWhileIdle);
        datasource.setTestOnBorrow(testOnBorrow);
        datasource.setTestOnReturn(testOnReturn);
        datasource.setPoolPreparedStatements(poolPreparedStatements);
        datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
        try {
            datasource.setFilters(filters);
        } catch (SQLException e) {
            System.err.println("druid configuration initialization filter: "+ e);
        }
        datasource.setConnectionProperties(connectionProperties);
        return datasource;
    }

    @Bean
    public ServletRegistrationBean druidServlet() {
        logger.info("init Druid Servlet Configuration ");
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
        // IP白名單
        //servletRegistrationBean.addInitParameter("allow", "192.168.1.xxx,127.0.0.1");
        // IP黑名單(共同存在時,deny優先於allow)
        //servletRegistrationBean.addInitParameter("deny", "192.168.1.xxx");
        //控制檯管理使用者
        servletRegistrationBean.addInitParameter("loginUsername", "admin");
        servletRegistrationBean.addInitParameter("loginPassword", "admin");
        //是否能夠重置資料 禁用HTML頁面上的“Reset All”功能
        servletRegistrationBean.addInitParameter("resetEnable", "false");
        return servletRegistrationBean;
    }

    @Bean
    public FilterRegistrationBean filterRegistrationBean() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
        filterRegistrationBean.addUrlPatterns("/*");
        filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return filterRegistrationBean;
    }

}

配置了以上內容後,我認為就可以了,於是訪問localhost:8080/druid,也進入了登入頁,於是我輸入使用者名稱和密碼admin,admin,點選sign in,怎麼點都沒反應,於是搜尋為什麼,發現沒有。。。。只能從系統裡面再除錯,折騰一番,發現是SpringSecurity的CSRF導致的。。。

這裡有兩個辦法,一個是關閉CSRF,不過這種辦法不友好,還有就是對druid開放,示例程式碼如下:

import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.util.matcher.RequestMatcher;

import javax.servlet.http.HttpServletRequest;

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/").permitAll()
                .antMatchers("/hello").hasRole("USER").and()
                //.csrf().disable() //關閉CSRF
                .csrf().requireCsrfProtectionMatcher(new RequestMatcher() {
                    @Override
                    public boolean matches(HttpServletRequest httpServletRequest) {
                        String servletPath = httpServletRequest.getServletPath();
                        if (servletPath.contains("/druid")) {
                            return false;
                        }
                        return true;
                    }
                }).and()
            .formLogin().loginPage("/login").defaultSuccessUrl("/hello").and()
            .logout().logoutUrl("/logout").logoutSuccessUrl("/login");
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .inMemoryAuthentication()
                .withUser("user").password("password").roles("USER");
    }
}
再去訪問,解決了。。。。

————————更正——————————

上面這樣,會導致將原有的驗證覆蓋掉,會出現GET等原先放行的請求無法成功,需改為如下:

.csrf().requireCsrfProtectionMatcher(new RequestMatcher() {
    //放行這幾種請求
private Pattern allowedMethods = Pattern.compile("^(GET|HEAD|TRACE|OPTIONS)$");
//放行rest請求,當然後面rest與web將會分開,到時這裡可以刪除
private RegexRequestMatcher unprotectedMatcher = new RegexRequestMatcher("^/rest/.*", null);
@Override
public boolean matches(HttpServletRequest request) {
        if(allowedMethods.matcher(request.getMethod()).matches()){
            return false;
}

        String servletPath = request.getServletPath();
        if (servletPath.contains("/druid")) {
            return false;
}
        return !unprotectedMatcher.matches(request);
}
})


相關推薦

SpringBoot+SpringSecurity+Druid解決CSRF開啟問題

SpringBoot+Druid整合配置如下1、pom中引入依賴<!-- Druid 資料連線池依賴 --> <dependency>     <groupId>com.alibaba</groupId>     <art

前後端分離 SpringBoot + SpringSecurity 許可權解決方案

一、前言 而公司這邊都是前後端分離鮮明的,前端不要接觸過多的業務邏輯,都由後端解決,基本思路是這樣的: 服務端通過 JSON字串,告訴前端使用者有沒有登入、認證,前端根據這些提示跳轉對應的登入頁、認證頁等。 二、程式碼 下面給個示例,該自上述的之

springboot學習(十) springboot 新增druid監控,開啟慢日誌,配置spring監控

springboot 新增druid監控,開啟慢日誌,配置spring監控 1 新增druid依賴 compile group: 'com.alibaba', name: 'druid-spring-boot-starter', version: "$

springboot+springsecurity+cas實現sso,並開啟註解方法級別的許可權控制

springsecurity整合cas springsecurity的springsecurityfilterchian中有一個cas的攔截器位置,因此可以通過它把cas整合進springsecurity中 cas負責認證,security通過userDetails負責載入許可權,通過認證管理器

從零學springboot—— 配置druid資料來源,並開啟監控

匯入依賴 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version&g

springboot整合druid,sql監控無效果,解決方案

專案中引入的依賴: 問題分析: 1.配置檔案中的druid的配置引數資訊格式是否有錯誤,如下,是否全都是spring.datasource.* 如果格式有錯誤,那麼 new DruidDataSource()建立成功也是有問題的 2.配置統計攔截的

springboot + mybatis +druid

ima eth hid time col sele ons getname uid Druid Spring Boot Starter mybatis-spring-boot-autoconfigure 新建spring boot工程,添加pom依賴 <depen

SpringBoot配置Druid

root name initials log4 mysql gif 無法 table onsize Druid是Java語言中最好的數據庫連接池。Druid能夠提供強大的監控和擴展功能。關於詳細介紹可查看http://www.iteye.com/magazines/90 S

Springboot整合Druid監控

table 註解 param AI 添加 col div eset nds 一.添加依賴 <dependency> <groupId>com.alibaba</groupId> <a

SpringBoot配置Druid數據源

director 監測 jdbc 最小 upa 禁用 getc 是否有效 顯示調用 在我剛開始接觸JDBC的時候,用的是DriveManager驅動來連接數據庫的。而現在大多是用DataSource。 這裏先簡單說一下區別: 1、datasource是與連接池獲取連接,而D

基於SpringBoot+SpringSecurity+mybatis+layui實現的一款權限系統

數據操作 myba lan boot png 以及 bubuko 其中 yui 這是一款適合初學者學習權限以及springBoot開發,mybatis綜合操作的後臺權限管理系統 其中設計到的數據查詢有一對一,一對多,多對多,聯合分步查詢,充分利用mybatis的強大實現各

[轉]解決STM32開啟定時器時立即進入一次中斷程序問題

結果 程序 相關 fig 請求 啟動 其中 邏輯性 ear 整理:MilerShao 在用到STM32定時器的更新中斷時,發現有些情形下只要開啟定時器就立即進入一次中斷。準確說,只要使能更新中斷允許位就立即響應一次更新中斷【當然前提是相關NVIC也已經配置好】。

在 Flask 項目中解決 CSRF 攻擊

存在 hub 個人 自然 是什麽 直接 ... bubuko image #轉載請留言聯系 1. CSRF是什麽? CSRF全拼為Cross Site Request Forgery,譯為跨站請求偽造。 CSRF指攻擊者盜用了你的身份,以你的名義發送惡意請求。包括:以你名

springboot+mybatis+druid 多資料來源整合

       前言:在上一篇文章裡面我們進行了spring boot 和 mybatis 的整合 《springboot整合mybatis使用druid資料來源》, 文中是使用的單資料來源,因為專案中有很多需要用到多資料來源的場景,比如主從同步(讀寫分離)

解決webstorm開啟專案後卡頓問題

第一步: File -> Settings -> Build,Execution,Deployment ->Deployment -> Options 在Exclude items by name中新增:node_modules 第二步: F

SpringBoot整合Redis解決叢集共享快取問題

需求分析: 應用程式採用整合的方式部署在3臺伺服器上,每臺伺服器上應用請求同一臺資料庫伺服器,應用程式中獲取當前使用者資訊是從當前伺服器上選取的,當前臺傳送求後需在後臺修改當前使用者的相關屬性,然後查詢當前屬性下的一些資料資訊 產生問題: 採用整合的方式部署,會導致當前修改請

解決stackOverflow開啟慢的問題(一個 Chrome 外掛:將 Google CDN 替換為國內的。)

轉載自:https://blog.csdn.net/u010123949/article/details/79918737 stackOverflow開啟慢並不是stackoverflow被牆,而是因為stackoverflow用了google的api,而Google在天朝是用不了的,所以才導致

徹底解決IL2CPP 開啟Strip Engine Code選項後帶來的崩潰問題

  IL2CPP根據C#生成的Cpp程式碼行數巨大,達到百萬行級別,進而引起iOS平臺可執行檔案超過60MB的問題。因此在適當的時候有必要對UnityEngine下的程式碼進行Strip。但是這樣做容易帶來如下的問題: ReportException: UnityLogError Co

springboot整合 druid 監控

1.匯入依賴 <!--引入druid資料來源--> <!-- https://mvnrepository.com/artifact/com.alibaba/druid --> <dependency> <groupId>com.

springbootdruid監控的配置(DruidConfiguration)

當資料庫連線池使用druid 時,我們進行一些簡單的配置就能檢視到sql監控,web監控,url監控等等。 以springboot為例,配置如下 import com.alibaba.druid.support.http.StatViewServlet; import com.