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

詳解springSecurity之java配置篇

 更新時(shí)間:2020年07月09日 10:12:51   作者:知識(shí)追尋者  
這篇文章主要介紹了詳解springSecurity之java配置篇,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一 前言

本篇是springSecurity知識(shí)的入門第二篇,主要內(nèi)容是如何使用java配置的方式進(jìn)行配置springSeciruty,然后通過一個(gè)簡(jiǎn)單的示例自定義登陸頁面,覆蓋原有springSecurity默認(rèn)的登陸頁面;學(xué)習(xí)這篇的基礎(chǔ)是 知識(shí)追尋者之前發(fā)布 過 的《springSecurity入門篇

二 java配置

2.1配置賬號(hào)密碼

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

/**
 * @Author lsc
 * <p> </p>
 */
@EnableWebSecurity// 開啟springSecurity
public class WebSecurityConfig {

  /* *
   * @Author lsc
   * <p> 主要是讓SpringSecurity知道springSecurityFilterChain負(fù)責(zé)管理應(yīng)用的URL
   * 校驗(yàn),通過賬號(hào),密碼的方式校驗(yàn)成功后重定向至應(yīng)用;
   * </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 此時(shí)輸入的密碼就是 user , user ; 或者 admin, admin;

2.2 默認(rèn)授權(quán)配置

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

 @Configuration
  public static class FormLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
      http
          .authorizeRequests(authorize ->
              authorize // 授權(quán)
              .anyRequest() // 任何請(qǐng)求
              .authenticated() // 認(rèn)證認(rèn)證
          )
          .formLogin(withDefaults()); //
    }
  }

2.3 過濾器順序

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

  @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 賬號(hào)密碼校驗(yàn)成功后跳轉(zhuǎn)應(yīng)用請(qǐng)求url, 出現(xiàn)禁止頁面,原因是user沒有ADMIN角色權(quán)限;

然后使用admin用戶登陸訪問 http://localhost:8080/api/login 賬號(hào)密碼校驗(yàn)成功后跳轉(zhuǎn)應(yīng)用請(qǐng)求url 正常放問;

登陸頁面如下

登陸成功后跳轉(zhuǎn)如下

三 自定義登陸頁面

3.1 實(shí)現(xiàn)自定頁面登陸

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

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

然后在templates 下新建 login.html , 內(nèi)容如下

<!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授權(quán)配置內(nèi)容如下,如下所示,loginPage 配置登陸頁面,注意不要帶上.html,loginProcessingUrl 配置登陸url,注意這邊的url要與 login.html里面的action的url一致,否則會(huì)報(bào)錯(cuò);后面就是successForwardUrl 登陸成功后的轉(zhuǎn)發(fā),當(dāng)然還有登陸失敗的轉(zhuǎn)發(fā)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")// 登陸成功后會(huì)轉(zhuǎn)發(fā)至 /login/success 請(qǐng)求
                .permitAll(); // 允許所有人訪問
          })
          .csrf().disable()
          .httpBasic();// http請(qǐng)求方式 ,web 瀏覽器會(huì)彈出對(duì)話框

    }
  }

再將控制層內(nèi)容替換如下啊,登陸邏輯就是我們請(qǐng)求 /login 會(huì)被轉(zhuǎn)發(fā)至login.html, 然后action 提交至 /login, 這邊已經(jīng)到springSecurity 內(nèi)部, 登陸成功后其會(huì)轉(zhuǎn)發(fā) 至 /login/success;

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

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

啟動(dòng)項(xiàng)目,瀏覽器輸入http://localhost:8080/login 或者其它 ip + port + / path 會(huì)自動(dòng)跳轉(zhuǎn)至自定義 登陸頁面

輸入成功后會(huì)跳轉(zhuǎn)的 /login/success ,返回內(nèi)容如下

3.2 自定義登陸流程分析

來自官網(wǎng)的圖片如下,是form表單登陸的流程,

  1. 首先客戶端會(huì)發(fā)送未授權(quán)請(qǐng)求到服務(wù)端會(huì)被 FilterSecurityInterceptor 攔截標(biāo)明為未授權(quán)的請(qǐng)求,拋出AccessDeniedException;
  2. ExceptionTranslationFilter 會(huì)捕獲 AccessDeniedException 異常
  3. 此時(shí) AuthenticationEntryPoint 會(huì)初始化配置流程;
  4. 捕獲異常后并且重定向到登陸頁面
  5. 最后 在登陸頁面輸入賬號(hào)密碼就會(huì)進(jìn)入認(rèn)證流程;

3.3 登陸認(rèn)證流程分析

官網(wǎng)登陸時(shí)的認(rèn)證流程圖片如下

  • 賬號(hào)密碼輸入成功后,UsernamePasswordAuthenticationFilter 就會(huì)創(chuàng)建UsernamePasswordAuthenticationToken;
  • AuthenticationManager儲(chǔ)存著用戶的信息,UsernamePasswordAuthenticationToken 會(huì)被送至這邊進(jìn)行認(rèn)證;
  • 如果認(rèn)證失敗,SecurityContextHolder(主要是儲(chǔ)存認(rèn)證的數(shù)據(jù),principle,credentials,authorities)會(huì)被清空, RememberMeServices.loginFail 與 AuthenticationFailureHandler都會(huì)被調(diào)用;
  • 如果登陸成功SessionAuthenticationStrategy 會(huì)被喚起重新定制下一次的登陸,認(rèn)證信息會(huì)被儲(chǔ)存至SecurityContextHolder,如果配置了remberMe, RememberMeServices.loginSuccess會(huì)被調(diào)用,ApplicationEventPublisher 會(huì)發(fā)布InteractiveAuthenticationSuccessEvent,AuthenticationSuccessHandler會(huì)被調(diào)用;

簡(jiǎn)單概括就是賬號(hào)密碼輸入后進(jìn)入認(rèn)證流程,發(fā)放token, 在manager中認(rèn)證,如果認(rèn)證成功存儲(chǔ)認(rèn)證信息,否則清空認(rèn)證信息;

四 參考文檔

官方文檔

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

到此這篇關(guān)于詳解springSecurity之java配置篇的文章就介紹到這了,更多相關(guān)springSecurity java配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于MyBatis中SqlSessionFactory和SqlSession簡(jiǎn)解

    關(guān)于MyBatis中SqlSessionFactory和SqlSession簡(jiǎn)解

    這篇文章主要介紹了MyBatis中SqlSessionFactory和SqlSession簡(jiǎn)解,具有很好的參考價(jià)值,希望大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • java 如何實(shí)現(xiàn)日志追蹤MDC

    java 如何實(shí)現(xiàn)日志追蹤MDC

    這篇文章主要介紹了java 實(shí)現(xiàn)日志追蹤MDC方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • MyBatis Map結(jié)果的Key轉(zhuǎn)為駝峰式

    MyBatis Map結(jié)果的Key轉(zhuǎn)為駝峰式

    今天小編就為大家分享一篇關(guān)于MyBatis Map結(jié)果的Key轉(zhuǎn)為駝峰式,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • 詳解Spring不同數(shù)據(jù)庫(kù)異常如何抽象的

    詳解Spring不同數(shù)據(jù)庫(kù)異常如何抽象的

    根據(jù)spring-jdbc中的定義,所有的數(shù)據(jù)操作異常都會(huì)轉(zhuǎn)換為 DataAccessException,下面這篇文章主要給大家介紹了關(guān)于Spring不同數(shù)據(jù)庫(kù)異常如何抽象的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • java使用nio2拷貝文件的示例

    java使用nio2拷貝文件的示例

    這篇文章主要介紹了java使用nio2拷貝文件的示例,需要的朋友可以參考下
    2014-04-04
  • Java面試之如何實(shí)現(xiàn)10億數(shù)據(jù)判重

    Java面試之如何實(shí)現(xiàn)10億數(shù)據(jù)判重

    當(dāng)數(shù)據(jù)量比較大時(shí),使用常規(guī)的方式來判重就不行了,所以這篇文章小編主要來和大家介紹一下Java實(shí)現(xiàn)10億數(shù)據(jù)判重的相關(guān)方法,希望對(duì)大家有所幫助
    2024-02-02
  • 根據(jù)list中對(duì)象的屬性去重和排序小結(jié)(必看篇)

    根據(jù)list中對(duì)象的屬性去重和排序小結(jié)(必看篇)

    下面小編就為大家?guī)硪黄鶕?jù)list中對(duì)象的屬性去重和排序小結(jié)(必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • 解決maven打包排除類不生效maven-compiler-plugin問題

    解決maven打包排除類不生效maven-compiler-plugin問題

    總結(jié):在Spring Boot項(xiàng)目B中作為項(xiàng)目A的依賴時(shí),排除啟動(dòng)類不生效的原因是被其他類引用或父POM引入,解決方法是跳過test編譯或注釋掉@SpringBootTest(classes={BApplication.class})
    2024-11-11
  • Java實(shí)現(xiàn)使用Websocket發(fā)送消息詳細(xì)代碼舉例

    Java實(shí)現(xiàn)使用Websocket發(fā)送消息詳細(xì)代碼舉例

    這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)使用Websocket發(fā)送消息的相關(guān)資料,WebSocket是一種協(xié)議,用于在Web應(yīng)用程序和服務(wù)器之間建立實(shí)時(shí)、雙向的通信連接,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-05-05
  • java實(shí)習(xí)--每天打卡十道面試題!

    java實(shí)習(xí)--每天打卡十道面試題!

    臨近秋招,備戰(zhàn)暑期實(shí)習(xí),祝大家每天進(jìn)步億點(diǎn)點(diǎn)!本篇文章準(zhǔn)備了十道java的常用面試題,希望能夠給大家提供幫助,最后祝大家面試成功,進(jìn)入自己心儀的大廠
    2021-06-06

最新評(píng)論

大姚县| 新丰县| 万年县| 慈利县| 临江市| 廉江市| 恩平市| 常山县| 夏津县| 仁化县| 宿迁市| 鹤峰县| 琼结县| 察哈| 本溪市| 株洲市| 昌邑市| 旺苍县| 潮州市| 泰宁县| 凤台县| 香河县| 吉隆县| 长沙市| 阆中市| 浠水县| 永济市| 开远市| 文昌市| 诏安县| 克拉玛依市| 崇左市| 泸定县| 勃利县| 淳安县| 托里县| 昌乐县| 将乐县| 湘西| 宁德市| 商河县|