詳解springSecurity之java配置篇_java

來源:腳本之家  責任編輯:小易  

java培訓要2113學習的內容挺多,先簡單跟您說一下:Spring全家5261桶(4102SpringBoot/SpringCloud/SpringSession/SpringSecurity/SpringSocial)OAuth2.0社交登陸(SpringSocial集成QQ登陸)系統壓力1653測試(Apache ab)容器集群化部署(Docker+K8S+Rancher)分布式可視化配置中心(Apollo)數據異構解決方案(sharding-jdbc+ES集群)Canal+binlog增量訂閱異步編排技術(CompletableFuture)線程池&線程隔離分布式鎖高并發場景解決方案(Redis+Lua)分布式服務追蹤(Zipkin)Swagger2全系統接口文檔云存儲與本地存儲Servlet3/4異步并發、請求/響應復用RabbitMQ死信隊列、延遲隊列前端SPA完成后臺管理系統 權限控制(SpringSecurity)限流+redis秒殺解決方案(Vue.js+ElementUI+Node.js+Npm+Webpack)JDK9、JDK10新特性www.anxorj.tw防采集請勿采集本網。

一 前言

本篇是springSecurity知識的入門第二篇,主要內容是如何使用java配置的方式進行配置springSeciruty,然后通過一個簡單的示例自定義登陸頁面,覆蓋原有springSecurity默認的登陸頁面;學習這篇的基礎是 知識追尋者之前發布 過 的《springSecurity入門篇

二 java配置

2.1配置賬號密碼

如下所示, 使用 @EnableWebSecurity 在配置類上開啟security配置功能; 在配置類中定義bean 名為 UserDetailsService, 主要是 負責 設置賬號密碼,攔截URL,校驗成功后重定向至URL;如果要使用多用戶,使用 manager.createUser 方法即可;

/** * @Author lsc * <p> </p> */@EnableWebSecurity// 開啟springSecuritypublic class WebSecurityConfig { /* * * @Author lsc * <p> 主要是讓SpringSecurity知道springSecurityFilterChain負責管理應用的URL * 校驗,通過賬號,密碼的方式校驗成功后重定向至應用; * </p> * @Param [] */ @Bean public UserDetailsService userDetailsService() throws Exception { // User.UserBuilder users = User.withDefaultPasswordEncoder(); InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager(); manager.createUser(users.username("user").password("user").roles("USER").build()); manager.createUser(users.username("admin").password("admin").roles("USER","ADMIN").build()); return manager; }}

訪問 localhost:8080/login 此時輸入的密碼就是 user , user ; 或者 admin, admin;

2.2 默認授權配置

如下所示 往配置類中 添加 配置類,其 繼承 WebSecurityConfigurerAdapter, 重寫 configure(HttpSecurity http) 方法, 此方便的作用就是Security 的授權過程,如下示例中,任何的請求都需要認證才可以訪問,并且登陸頁面還是security自帶的登陸頁面;

@Configuration public static class FormLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests(authorize -> authorize // 授權 .anyRequest() // 任何請求 .authenticated() // 認證認證 ) .formLogin(withDefaults()); // } }

2.3 過濾器順序

再向配置中添加如下配置,其內容和上節內容差不多,但是 攔截的url 是 以/api 為開頭的URL, 并且 是 ADMIN 角色才擁有訪問權限; 使用@Order(1), 過濾器配置會優先走著條配置,其次才是上節 的配置;

@Configuration @Order(1) public static class ApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter { protected void configure(HttpSecurity http) throws Exception { http .antMatcher("/api/**") .authorizeRequests(authorize -> authorize .anyRequest().hasRole("ADMIN") ) .httpBasic(withDefaults()) .formLogin(withDefaults()); } }

控制層添加代碼如下

@GetMapping("api/login") public String login(){ return "login"; }

首先使用user用戶訪問 http://localhost:8080/api/login 賬號密碼校驗成功后跳轉應用請求url, 出現禁止頁面,原因是user沒有ADMIN角色權限;

然后使用admin用戶登陸訪問 http://localhost:8080/api/login 賬號密碼校驗成功后跳轉應用請求url 正常放問;

登陸頁面如下

登陸成功后跳轉如下

三 自定義登陸頁面

3.1 實現自定頁面登陸

自定義登陸頁面 知識追尋者這邊需要引入引擎模板依賴 , thymeleaf; application配置如下

spring: # 引擎模板配置 thymeleaf: cache: false # 關閉緩存 mode: HTML prefix: classpath:/templates/ # 指定 thymeleaf 模板路徑 encoding: UTF-8 # 指定字符集編碼 mvc: static-path-pattern: /static/** # js ,css 等靜態文件路徑

然后在templates 下新建 login.html , 內容如下

<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org"><head> <title>Please Log In</title></head><body><h1>Please Log In</h1><div th:if="${param.error}"> Invalid username and password.</div><div th:if="${param.logout}"> You have been logged out.</div><form th:action="@{/login}" method="post"> <div> <input type="text" name="username" placeholder="Username"/> </div> <div> <input type="password" name="password" placeholder="Password"/> </div> <input type="submit" value="Log in" /></form></body></html>

springSecurity授權配置內容如下,如下所示,loginPage 配置登陸頁面,注意不要帶上.html,loginProcessingUrl 配置登陸url,注意這邊的url要與 login.html里面的action的url一致,否則會報錯;后面就是successForwardUrl 登陸成功后的轉發,當然還有登陸失敗的轉發failureForwardUrl(), 讀者按需配置即可;

@Configuration @Order(1) public static class ApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter { protected void configure(HttpSecurity http) throws Exception { http .antMatcher("/**") .authorizeRequests(authorize -> authorize .anyRequest().hasRole("USER") ) .formLogin(form -> { form .loginPage("/login") // 配置登陸頁 .loginProcessingUrl("/login") .successForwardUrl("/login/success")// 登陸成功后會轉發至 /login/success 請求 .permitAll(); // 允許所有人訪問 }) .csrf().disable() .httpBasic();// http請求方式 ,web 瀏覽器會彈出對話框 } }

再將控制層內容替換如下啊,登陸邏輯就是我們請求 /login 會被轉發至login.html, 然后action 提交至 /login, 這邊已經到springSecurity 內部, 登陸成功后其會轉發 至 /login/success;

@GetMapping("/login") public String login() { return "login"; } @PostMapping("/login/success") @ResponseBody public String success() { return "sucess"; }

啟動項目,瀏覽器輸入http://localhost:8080/login 或者其它 ip + port + / path 會自動跳轉至自定義 登陸頁面

輸入成功后會跳轉的 /login/success ,返回內容如下

3.2 自定義登陸流程分析

來自官網的圖片如下,是form表單登陸的流程,

    首先客戶端會發送未授權請求到服務端會被 FilterSecurityInterceptor 攔截標明為未授權的請求,拋出AccessDeniedException; ExceptionTranslationFilter 會捕獲 AccessDeniedException 異常 此時 AuthenticationEntryPoint 會初始化配置流程; 捕獲異常后并且重定向到登陸頁面 最后 在登陸頁面輸入賬號密碼就會進入認證流程;

3.3 登陸認證流程分析

官網登陸時的認證流程圖片如下 賬號密碼輸入成功后,UsernamePasswordAuthenticationFilter 就會創建UsernamePasswordAuthenticationToken; AuthenticationManager儲存著用戶的信息,UsernamePasswordAuthenticationToken 會被送至這邊進行認證; 如果認證失敗,SecurityContextHolder(主要是儲存認證的數據,principle,credentials,authorities)會被清空, RememberMeServices.loginFail 與 AuthenticationFailureHandler都會被調用; 如果登陸成功SessionAuthenticationStrategy 會被喚起重新定制下一次的登陸,認證信息會被儲存至SecurityContextHolder,如果配置了remberMe, RememberMeServices.loginSuccess會被調用,ApplicationEventPublisher 會發布InteractiveAuthenticationSuccessEvent,AuthenticationSuccessHandler會被調用;

簡單概括就是賬號密碼輸入后進入認證流程,發放token, 在manager中認證,如果認證成功存儲認證信息,否則清空認證信息;

四 參考文檔

官方文檔

https://docs.spring.io/spring-security/site/docs/5.3.3.BUILD-SNAPSHOT/reference/html5/#servlet-authentication-form

到此這篇關于詳解springSecurity之java配置篇的文章就介紹到這了,更多相關springSecurity java配置內容請搜索真格學網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持真格學網!

發現這個問題已經在這放了那么久沒人回答,為了方便后面的人,我在這里就完結一下這個問題。Spring Security 默認action="j_spring_security_check",讓很多人不理解這個請求之后會跳轉到哪里去,這里我們就看配置文件里這個<http></http>標簽,這個標簽里面最基本的是intercept-url,用來設置訪問權限的。標簽里面有個form-login 標簽,這個標簽有很多屬性,大概情況如下:form-login屬性詳解1.login-page 自定義登錄頁url,默認為/login2.login-processing-url 登錄請求攔截的url,也就是form表單提交時指定的action3.default-target-url 默認登錄成功后跳轉的url4.always-use-default-target 是否總是使用默認的登錄成功后跳轉url5.authentication-failure-url 登錄失敗后跳轉的url6.username-parameter 用戶名的請求字段 默認為userName7.password-parameter 密碼的請求字段 默認為password8.authentication-success-handler-ref 指向一個AuthenticationSuccessHandler用于處理認證成功的請求,不能和default-target-url還有always-use-default-target同時使用9.authentication-success-forward-url 用于authentication-failure-handler-ref10.authentication-failure-handler-ref 指向一個AuthenticationFailureHandler用于處理失敗的認證請求11.authentication-failure-forward-url 用于authentication-failure-handler-ref12.authentication-details-source-ref 指向一個AuthenticationDetailsSource,在認證過濾器中使用看到第三條屬性沒?default-target-url這個屬性。在這里我們假設 你登錄成功需要調用一個名字叫toMain.do的action處理一些登錄后的邏輯,比如SpringMVC或者Struts2,那么你就可以在http這個標簽下配置這樣我們就可以在登錄成功后調用上面對應的action,關于action返回視圖,SpringMVC和Struts2這里我就不多說了內容來自www.anxorj.tw請勿采集。


  • 本文相關:
  • java開發之spring security實現基于mongodb的認證功能
  • java中spring security的實例詳解
  • java中springsecurity密碼錯誤5次鎖定用戶的實現方法
  • java中自定義spring security權限控制管理示例(實戰篇)
  • javaweb開發之spring+springmvc+mybatis+springsecurity+ehcache+jcaptcha 完整web基礎框架
  • java繪制哆啦a夢 超可愛
  • hibernate批量操作實例詳解
  • java abstract class interface之間的區別介紹
  • java實現udp通信過程實例分析【服務器端與客戶端】
  • java中map內部存儲方式解析
  • java基于正則實現的日期校驗功能示例
  • java方法重載overload原理及使用解析
  • 如何將應用的log4j替換成logback詳解
  • java實現簡單日期計算功能
  • java聊天室的實現代碼
  • Spring Security 使用非spring默認的登陸頁面,是如何跳轉到登陸成功頁面的?
  • java培訓要學習哪些內容?
  • Java培訓都學哪些知識?
  • java培訓課程有哪些?
  • 網站首頁網頁制作腳本下載服務器操作系統網站運營平面設計媒體動畫電腦基礎硬件教程網絡安全c#教程vbvb.netc 語言java編程delphijavaandroidiosswiftscala易語言匯編語言其它相關首頁javajava開發之spring security實現基于mongodb的認證功能java中spring security的實例詳解java中springsecurity密碼錯誤5次鎖定用戶的實現方法java中自定義spring security權限控制管理示例(實戰篇)javaweb開發之spring+springmvc+mybatis+springsecurity+ehcache+jcaptcha 完整web基礎框架java繪制哆啦a夢 超可愛hibernate批量操作實例詳解java abstract class interface之間的區別介紹java實現udp通信過程實例分析【服務器端與客戶端】java中map內部存儲方式解析java基于正則實現的日期校驗功能示例java方法重載overload原理及使用解析如何將應用的log4j替換成logback詳解java實現簡單日期計算功能java聊天室的實現代碼java使double保留兩位小數的多方java8 十大新特性詳解java.net.socketexception: connjava寫入文件的幾種方法分享java環境變量的設置方法(圖文教程java 十六進制與字符串的轉換java list用法示例詳解java中file類的使用方法javaweb實現文件上傳下載功能實例java 字符串截取的三種方法(推薦基于java創建一個訂單類代碼實例java程序員必須要學會的linux命令總結(推java通過pdf模板填寫pdf表單springboot http請求注解@restcontroller詳解spring batch 入門學習教程(附源碼)java查找圖中兩點之間所有路徑深入學習java內存化和函數式協同java中字符串函數substring的用法小結java 對稱加密算法實現詳解java數據結構與算法之希爾排序詳解
    免責聲明 - 關于我們 - 聯系我們 - 廣告聯系 - 友情鏈接 - 幫助中心 - 頻道導航
    Copyright © 2017 www.anxorj.tw All Rights Reserved
    陕西快乐10分下载