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