激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - java編程SpringSecurity入門原理及應(yīng)用簡介

java編程SpringSecurity入門原理及應(yīng)用簡介

2022-01-20 12:01不會編程的派大星 Java教程

Spring 是非常流行和成功的 Java 應(yīng)用開發(fā)框架,Spring Security 正是 Spring 家族中的成員。Spring Security 基于 Spring 框架,提供了一套 Web 應(yīng)用安全性的完整解決方案

1. SpringSecurity 框架簡介

1.1 概要

正如你可能知道的關(guān)于安全方面的兩個主要區(qū)域是“認證”和“授權(quán)”(或者訪問控制),一般來說,Web 應(yīng)用的安全性包括用戶認證(Authentication)和用戶授權(quán)(Authorization)兩個部分,這兩點也是 Spring Security 重要核心功能。

(1) 用戶認證指的是:驗證某個用戶是否為系統(tǒng)中的合法主體,也就是說用戶能否訪問該系統(tǒng)。用戶認證一般要求用戶提供用戶名和密碼。系統(tǒng)通過校驗用戶名和密碼來完成認證過程。通俗點說就是系統(tǒng)認為用戶是否能登錄

(2) 用戶授權(quán)指的是驗證某個用戶是否有權(quán)限執(zhí)行某個操作。在一個系統(tǒng)中,不同用戶所具有的權(quán)限是不同的。比如對一個文件來說,有的用戶只能進行讀取,而有的用戶可以進行修改。一般來說,系統(tǒng)會為不同的用戶分配不同的角色,而每個角色則對應(yīng)一系列的權(quán)限。通俗點講就是系統(tǒng)判斷用戶是否有權(quán)限去做某些事情。

1.2 組成以及同款產(chǎn)品(shiro)對比

1.2.1 Spring Security

SpringSecurity 特點:

  • 和 Spring 無縫整合。
  • 全面的權(quán)限控制。
  • 專門為Web 開發(fā)而設(shè)計。
  • 舊版本不能脫離Web 環(huán)境使用。
  • 新版本對整個框架進行了分層抽取,分成了核心模塊和Web 模塊。單獨引入核心模塊就可以脫離Web 環(huán)境。
  • 重量級。

1.2.2 Shiro

Apache 旗下的輕量級權(quán)限控制框架。

特點:

  • 輕量級。Shiro 主張的理念是把復(fù)雜的事情變簡單。針對對性能有更高要求的互聯(lián)網(wǎng)應(yīng)用有更好表現(xiàn)。
  • 通用性。

好處:不局限于Web 環(huán)境,可以脫離Web 環(huán)境使用。
缺陷:在Web 環(huán)境下一些特定的需求需要手動編寫代碼定制。

Spring Security 是 Spring 家族中的一個安全管理框架,實際上,在 Spring Boot 出現(xiàn)之前,Spring Security 就已經(jīng)發(fā)展了多年了,但是使用的并不多,安全管理這個領(lǐng)域,一直是 Shiro 的天下。

相對于 Shiro,在 SSM 中整合 Spring Security 都是比較麻煩的操作,所以,SpringSecurity 雖然功能比 Shiro 強大,但是使用反而沒有 Shiro 多(Shiro 雖然功能沒有Spring Security 多,但是對于大部分項目而言,Shiro 也夠用了)。

自從有了 Spring Boot 之后,Spring Boot 對于 Spring Security 提供了自動化配置方案,可以使用更少的配置來使用 Spring Security。

因此,一般來說,常見的安全管理技術(shù)棧的組合是這樣的:

SSM + Shiro
Spring Boot/Spring Cloud + Spring Security

以上只是一個推薦的組合而已,如果單純從技術(shù)上來說,無論怎么組合,都是可以運行的。

1.3 模塊劃分

java編程SpringSecurity入門原理及應(yīng)用簡介

1.4 SpringSecurity 基本原理

SpringSecurity 本質(zhì)是一個過濾器鏈: 從啟動是可以獲取到過濾器鏈:

java編程SpringSecurity入門原理及應(yīng)用簡介

代碼底層流程:重點看三個過濾器:
FilterSecurityInterceptor:是一個方法級的權(quán)限過濾器, 基本位于過濾鏈的最底部。

1.5.UserDetailsService 接口講解

當(dāng)什么也沒有配置的時候,賬號和密碼是由 Spring Security 定義生成的。而在實際項目中
賬號和密碼都是從數(shù)據(jù)庫中查詢出來的。 所以我們要通過自定義邏輯控制認證邏輯。
如果需要自定義邏輯時,只需要實現(xiàn)userDetailsService接口即可,定義如下:

java編程SpringSecurity入門原理及應(yīng)用簡介

 

2.SpringSecurity Web 權(quán)限方案

2.1設(shè)置登錄系統(tǒng)的賬號密碼(三種方式)

一:在application.xml中自行配置

spring.security.user.name = xxx
spring.security.user.password = xxx

二:編寫類實現(xiàn)接口

三:實現(xiàn)數(shù)據(jù)庫認證來完成用戶登錄
這里就拿一個例子來完成認證和授權(quán)

設(shè)計數(shù)據(jù)庫表

java編程SpringSecurity入門原理及應(yīng)用簡介

建立springboot項目,勾選相應(yīng)依賴

java編程SpringSecurity入門原理及應(yīng)用簡介

完整pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.3.1.RELEASE</version>
      <relativePath/> <!-- lookup parent from repository -->
  </parent>
  <groupId>com.example</groupId>
  <artifactId>demo</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>demo</name>
  <description>Demo project for Spring Boot</description>
  <properties>
      <java.version>1.8</java.version>
  </properties>
  <dependencies>
      <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>druid</artifactId>
          <version>1.1.9</version>
      </dependency>
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-security</artifactId>
      </dependency>
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <dependency>
          <groupId>org.mybatis.spring.boot</groupId>
          <artifactId>mybatis-spring-boot-starter</artifactId>
          <version>2.1.3</version>
      </dependency>
      <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <scope>runtime</scope>
      </dependency>
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-test</artifactId>
          <scope>test</scope>
          <exclusions>
              <exclusion>
                  <groupId>org.junit.vintage</groupId>
                  <artifactId>junit-vintage-engine</artifactId>
              </exclusion>
          </exclusions>
      </dependency>
      <dependency>
          <groupId>org.springframework.security</groupId>
          <artifactId>spring-security-test</artifactId>
          <scope>test</scope>
      </dependency>
  </dependencies>
  <build>
      <plugins>
          <plugin>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-maven-plugin</artifactId>
          </plugin>
      </plugins>
  </build>
</project>

數(shù)據(jù)庫配置

spring:
datasource:
  type: com.alibaba.druid.pool.DruidDataSource
  username: root
  password: xxxxxx
  url: jdbc:mysql://xxxxxxxxxx //根據(jù)自己情況填寫
 

創(chuàng)建對應(yīng)的實體類

package com.example.demo.domain;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class User implements UserDetails {
  private Integer id;
  private String username;
  private String password;
  private Boolean enabled;
  private Boolean locked;
  private List<Role> roles;
  @Override
  // 實體類和SpringSecurity轉(zhuǎn)換
  public Collection<? extends GrantedAuthority> getAuthorities() {
      List<SimpleGrantedAuthority> authorities = new ArrayList<>();
      for (Role role : roles) {
          authorities.add(new SimpleGrantedAuthority(role.getName()));
      }
      return authorities;
  }
  @Override
  public String getPassword() {
      return null;
  }
  @Override
  public String getUsername() {
      return null;
  }
  @Override
  public boolean isAccountNonExpired() {
      return false;
  }
  @Override
  public boolean isAccountNonLocked() {
      return false;
  }
  @Override
  public boolean isCredentialsNonExpired() {
      return false;
  }
  @Override
  public boolean isEnabled() {
      return false;
  }
  public Integer getId() {
      return id;
  }
  public void setId(Integer id) {
      this.id = id;
  }
  public void setUsername(String username) {
      this.username = username;
  }
  public void setPassword(String password) {
      this.password = password;
  }
  public Boolean getEnabled() {
      return enabled;
  }
  public void setEnabled(Boolean enabled) {
      this.enabled = enabled;
  }
  public Boolean getLocked() {
      return locked;
  }
  public void setLocked(Boolean locked) {
      this.locked = locked;
  }
  public List<Role> getRoles() {
      return roles;
  }
  public void setRoles(List<Role> roles) {
      this.roles = roles;
  }
}

package com.example.demo.domain;
public class Role {
  private Integer id;
  private String name;
  private String nameZh;
  public Integer getId() {
      return id;
  }
  public void setId(Integer id) {
      this.id = id;
  }
  public String getName() {
      return name;
  }
  public void setName(String name) {
      this.name = name;
  }
  public String getNameZh() {
      return nameZh;
  }
  public void setNameZh(String nameZh) {
      this.nameZh = nameZh;
  }
}

創(chuàng)建service層

package com.example.demo.mapper;
import com.example.demo.domain.Role;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.graalvm.compiler.nodeinfo.StructuralInput;
import org.springframework.security.core.userdetails.User;
import java.util.List;
@Mapper
public interface UserMapper {
  @Select("select * from user where username=#{username}")
  public User loadUserByUsername(String username);
  @Select("select * from role r, user_role ur where r.id = ur.rid and ur.uid = #{id}")
  public List<Role> getUserRoleByUid(Integer id);
}

配置spring security

package com.example.demo.config;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.Bean;
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.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@Configurable
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
  @Autowired
  private UserService userService;
  @Bean
  PasswordEncoder passwordEncoder(){
      return new BCryptPasswordEncoder();
  }
  @Override
  protected void configure(AuthenticationManagerBuilder auth) throws Exception {
      auth.userDetailsService(userService);
  }
  @Override
  protected void configure(HttpSecurity http) throws Exception {
      http.authorizeRequests()
              .antMatchers("/admin/**").hasRole("admin")
              .anyRequest().authenticated()
              .and()
              .formLogin()
              .loginProcessingUrl("/login").permitAll()
              .and()
              .csrf().disable();
  }
}


security配置類說明

java編程SpringSecurity入門原理及應(yīng)用簡介

 

3.security-記住我-的實現(xiàn)

在security配置類中開啟remember me功能,并設(shè)置有效期。默認時間為兩周。

java編程SpringSecurity入門原理及應(yīng)用簡介

 

4.用戶注銷功能實現(xiàn)

通過退出按鈕找到映射地址,在配置類中添加退出映射地址

java編程SpringSecurity入門原理及應(yīng)用簡介

 

5.關(guān)于CSRF

跨站請求偽造(英語:Cross-site request forgery),也被稱為 one-click
attack 或者 session riding,通常縮寫為 CSRF 或者 XSRF, 是一種挾制用戶在當(dāng)前已登錄的 Web 應(yīng)用程序上執(zhí)行非本意的操作的攻擊方法。跟跨網(wǎng)站腳本(XSS)相比,XSS 利用的是用戶對指定網(wǎng)站的信任,CSRF 利用的是網(wǎng)站對用戶網(wǎng)頁瀏覽器的信任。

跨站請求攻擊,簡單地說,是攻擊者通過一些技術(shù)手段欺騙用戶的瀏覽器去訪問一個自己曾經(jīng)認證過的網(wǎng)站并運行一些操作(如發(fā)郵件,發(fā)消息,甚至財產(chǎn)操作如轉(zhuǎn)賬和購買商品)。由于瀏覽器曾經(jīng)認證過,所以被訪問的網(wǎng)站會認為是真正的用戶操作而去運行。這利用了web 中用戶身份驗證的一個漏洞:簡單的身份驗證只能保證請求發(fā)自某個用戶的瀏覽器,卻不能保證請求本身是用戶自愿發(fā)出的。

從 Spring Security 4.0 開始,默認情況下會啟用CSRF 保護,以防止CSRF 攻擊應(yīng)用程序,Spring Security CSRF 會針對 PATCH,POST,PUT 和DELETE 方法進行防護。

 

6.spring security原理總結(jié)

SpringSecurity 采用的是責(zé)任鏈的設(shè)計模式,它有一條很長的過濾器鏈。

現(xiàn)在對這條過濾器鏈的 15 個過濾器進行說明:

(1) WebAsyncManagerIntegrationFilter:將 Security 上下文與 Spring Web 中用于處理異步請求映射的 WebAsyncManager 進行集成。

(2) SecurityContextPersistenceFilter:在每次請求處理之前將該請求相關(guān)的安全上下文信息加載到 SecurityContextHolder 中,然后在該次請求處理完成之后,將
SecurityContextHolder 中關(guān)于這次請求的信息存儲到一個“倉儲”中,然后將
SecurityContextHolder 中的信息清除,例如在 Session 中維護一個用戶的安全信息就是這個過濾器處理的。

(3) HeaderWriterFilter:用于將頭信息加入響應(yīng)中。

(4) CsrfFilter:用于處理跨站請求偽造。

(5) LogoutFilter:用于處理退出登錄。

(6) UsernamePasswordAuthenticationFilter:用于處理基于表單的登錄請求,從表單中獲取用戶名和密碼。默認情況下處理來自 /login 的請求。從表單中獲取用戶名和密碼時,默認使用的表單 name 值為 username 和 password,這兩個值可以通過設(shè)置這個過濾器的 usernameParameter 和 passwordParameter 兩個參數(shù)的值進行修改。

(7) DefaultLoginPageGeneratingFilter:如果沒有配置登錄頁面,那系統(tǒng)初始化時就會配置這個過濾器,并且用于在需要進行登錄時生成一個登錄表單頁面。

(8) BasicAuthenticationFilter:檢測和處理 http basic 認證。

(9) RequestCacheAwareFilter:用來處理請求的緩存。

(10) SecurityContextHolderAwareRequestFilter:主要是包裝請求對象 request。

(11) AnonymousAuthenticationFilter:檢測 SecurityContextHolder 中是否存在
Authentication 對象,如果不存在為其提供一個匿名 Authentication。

(12) SessionManagementFilter:管理 session 的過濾器

(13) ExceptionTranslationFilter:處理 AccessDeniedException 和
AuthenticationException 異常。

(14) FilterSecurityInterceptor:可以看做過濾器鏈的出口。

(15) RememberMeAuthenticationFilter:當(dāng)用戶沒有登錄而直接訪問資源時, 從 cookie 里找出用戶的信息, 如果 Spring Security 能夠識別出用戶提供的 remember me cookie, 用戶將不必填寫用戶名和密碼, 而是直接登錄進入系統(tǒng),該過濾器默認不開啟。

以上就是java編程入門SpringSecurity原理及應(yīng)用簡介的詳細內(nèi)容,更多關(guān)于java編程SpringSecurity簡介的資料請關(guān)注服務(wù)器之家其它相關(guān)文章!

原文鏈接:https://blog.csdn.net/weixin_45827693/article/details/114648008?spm=1001.2014.3001.5501

延伸 · 閱讀

精彩推薦
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發(fā)現(xiàn)了對于集合操作轉(zhuǎn)換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關(guān)于Java8中S...

    阿杜7482021-02-04
  • Java教程Java實現(xiàn)搶紅包功能

    Java實現(xiàn)搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現(xiàn)搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經(jīng)有好久沒有升過級了。升級完畢重啟之后,突然發(fā)現(xiàn)好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發(fā)項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關(guān)于小米推送Java代碼,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩(wěn)中求8032021-07-12
  • Java教程xml與Java對象的轉(zhuǎn)換詳解

    xml與Java對象的轉(zhuǎn)換詳解

    這篇文章主要介紹了xml與Java對象的轉(zhuǎn)換詳解的相關(guān)資料,需要的朋友可以參考下...

    Java教程網(wǎng)2942020-09-17
  • Java教程Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
主站蜘蛛池模板: 成人午夜小视频 | 欧美成人久久 | 日韩在线观看中文字幕 | 中文字幕国| 亚洲欧洲日产v特级毛片 | 国产一区二区不卡视频 | 欧美黄一区| 成人午夜视频在线观看免费 | 国产女王女m视频vk 毛片免费在线视频 | 成人在线观看一区 | 日本不卡一区在线观看 | 国产午夜电影在线观看 | 欧美性生话视频 | 国产91九色在线播放 | 久久精品久久久久 | 精品一区二区久久久久久按摩 | 欧美成人黄色小视频 | 美国一级毛片片aa久久综合 | 久久精品探花 | 国产正在播放 | 91精品国产九九九久久久亚洲 | 日本一区二区三区视频在线 | 黄色免费在线视频网站 | 国产一区二区三区手机在线 | 一级毛片手机在线观看 | 91精品国产91久久久久久不卞 | 成人一区二区三区在线 | 看免费5xxaaa毛片 | 羞羞网站| 国产亚洲高清视频 | 久久国产精品无码网站 | 欧美一级毛片美99毛片 | 19禁国产精品福利视频 | 免费观看国产视频 | 亚洲二区三区在线 | 亚洲一区成人 | 成人啪啪色婷婷久 | 久久国产精品久久久久久 | 成人区一区二区 | 欧美精品欧美极品欧美激情 | 天天干导航 |