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

一文詳解Spring Security的基本用法

 更新時間:2022年05月19日 17:03:28   作者:北根娃  
Spring Security是一個功能強大且高度可定制的身份驗證和訪問控制框架, 提供了完善的認證機制和方法級的授權功能。本文將通過一個簡單的案例了解一下Spring Security的基本用法,需要的可以參考一下

Spring Security是一個功能強大且高度可定制的身份驗證和訪問控制框架, 提供了完善的認證機制和方法級的授權功能。是一款非常優(yōu)秀的權限管理框架。它的核心是一組過濾器鏈,不同的功能經(jīng)由不同的過濾器。 今天通過一個簡單的案例了解一下Spring Security的基本用法

1.引入依賴

在項目中引入Spring Security依賴,代碼如下:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

引入依賴后,整個項目都被Spring Security保護起來,所有的接口都要登錄之后才能訪問了,例如,我需要訪問/doc.html接口文檔,直接跳到登錄頁面。如下圖:

這時,你會有十萬個為什么啦?這個頁面哪里的?這個用戶名和密碼是啥?等等。不著急,聽我一一道來。

2.用戶名和密碼在哪里設置

當我們引入了Spring Secruity依賴后,啟動項目之后,密碼就會在控制臺中輸出的,格式是UUID,每一次啟動密碼都不一樣的,而用戶名是默認是User的。

Using generated security password: 8b2d752b-8892-4cd3-a7a9-a36e79e1cad8

我們可以通過項目的配置文件自定義用戶名和密碼的,代碼如下,這樣每次重啟項目,用戶名和密碼都是固定不變的。

spring:
  security:
      user:
        name: didiplus
        password: didiplus

3.UserDetailsService接口詳解

UserDetailsService接口只有一個抽象方法就是loadUserByUsername(String username)。代碼如下:

public interface UserDetailsService {

	UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;

}

UserDetailsService接口的返回值是UserDetails接口, 這又是一個接口,Spring Security框架提供了它的實現(xiàn)類org.springframework.security.core.userdetails包下的User類對象 。userdetails源碼如下:

Spring Security提供了三個UserDetailsService接口的實現(xiàn)類,分別是CachingUserDetailsService,JdbcDaoImpl,InMemoryUserDetailsManager

3.1JdbcDaoImpl實現(xiàn)類

該實現(xiàn)類是通過數(shù)據(jù)庫獲取用戶名和密碼,JdbcUserDetailsManager中定義了一大堆SQL語句,如下:

接著我們在看一下JdbcDaoImpl中的loadUsersByUsername方法,如下:

3.2InMemoryUserDetailsManager實現(xiàn)類

以上代碼是判斷內存中的HashMap集合中是否有用戶數(shù)據(jù)對應的User對象,如果沒有,直接拋出異常,如果有就返回該用戶的User對象信息。

以上代碼是把配置文件中的User相關信息讀取到。通過分析源碼發(fā)現(xiàn) Spring Security框架完成用戶登錄認證的核心就在與org.springframework.security.core.userdetails包下的UserDetailsService接口。

3.3自定義實現(xiàn)類實現(xiàn)UserDetailsService接口

自定義實現(xiàn)類MyUserDetailsServiceImpl,代碼如下:

@Service
public class MyUserDetailsServiceImpl implements UserDetailsService {

    private static  final  String USERNAME="admin";
    private static  final  String PASSWORD="admin123";

 

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        if (!USERNAME.equals(username)){
            throw new UsernameNotFoundException("用戶名不存在");
        }
        UserDetails userDetails =  new User(USERNAME,PASSWORD, AuthorityUtils.commaSeparatedStringToAuthorityList("admin,common"));
        return userDetails;
    }
}

重啟項目看看,輸入定義的用戶名和密碼,發(fā)現(xiàn)登錄不了,查看控制臺發(fā)現(xiàn)報錯,提示如下:

報錯的原因是沒有使用任何的PasswordEncoder,我們輸入的密碼沒有用加密工具進行加密 。 Spring Security其實已經(jīng)給我們提供了很多的PasswordEncoder 。 在org.springframework.security.crypto.password包下有一個PasswordEncoder接口,看看他的實現(xiàn)類

把這個PasswordEncoder的任意一個我們需要用來加密密碼的實現(xiàn)類的Bean注入到容器里面,就可以直接拿來使用 ,代碼如下:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean
    public BCryptPasswordEncoder bCryptPasswordEncoder(){
        return new BCryptPasswordEncoder();
    }
}

修改MyUserDetailsServiceImpl類如下:

@Service
public class MyUserDetailsServiceImpl implements UserDetailsService {

    private static  final  String USERNAME="admin";
    private static  final  String PASSWORD="admin123";

    @Resource
    BCryptPasswordEncoder cryptPasswordEncoder;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        if (!USERNAME.equals(username)){
            throw new UsernameNotFoundException("用戶名不存在");
        }
        UserDetails userDetails =  new User(USERNAME,cryptPasswordEncoder.encode(PASSWORD), AuthorityUtils.commaSeparatedStringToAuthorityList("admin,common"));
        return userDetails;
    }
}

重啟項目再次測試,輸入定義的賬號和密碼。即可訪問到接口文檔頁面。

4.如何修改登錄頁面

覺得默認的登錄頁面很丑,我們如何定義自己的登錄頁面呢?方法也很簡單,首先我們先去準備一個登錄頁面。如下:

前端代碼如下:

<form action="/login" class="login-form" >
    <h1>登錄</h1>

    <div class="txtb">
        <input type="text" name="user">
        <span data-placeholder="Username"></span>
    </div>

    <div class="txtb">
        <input type="password" name="pass">
        <span data-placeholder="Password"></span>
    </div>
    <input type="submit" class="logbtn" value="登錄">

    <div class="bottom-text">
        Don't have account? <a href="#" rel="external nofollow" >Sign up</a>
    </div>

</form>

把登錄頁面文件存放到項目的資源文件夾中static目錄下,然后在SecurityConfig重寫configure(HttpSecurity http)這個方法,代碼如下:

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.formLogin()
                .loginPage("/login.html") #自定義登錄頁面
                .usernameParameter("user") #對應前端表達name屬性
                .passwordParameter("pass") #對應前端表達name屬性
                .loginProcessingUrl("/login")
                .defaultSuccessUrl("/doc.html") #登錄成功后跳轉的頁面地址
                .failureUrl("/login?error=true")
                .and()
                .authorizeRequests()
                .antMatchers("/login.html").permitAll() #放通登錄頁面
                .anyRequest().authenticated(); #其他請求都要認證
        http.csrf().disable();
    }

重新啟動項目,輸入定義的用戶名和密碼,登錄成功直接跳轉到/doc.html。

antMatchers("url").permitAll() 是把某個url放通,不需要登錄就能訪問。

到此這篇關于一文詳解Spring Security的基本用法的文章就介紹到這了,更多相關Spring Security用法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java網(wǎng)絡編程TCP實現(xiàn)聊天功能

    Java網(wǎng)絡編程TCP實現(xiàn)聊天功能

    這篇文章主要為大家詳細介紹了Java網(wǎng)絡編程TCP實現(xiàn)聊天功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 簡單了解JAVA內存區(qū)域效果知識

    簡單了解JAVA內存區(qū)域效果知識

    這篇文章主要介紹了簡單了解JAVA內存區(qū)域效果知識,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • 基于Java事件監(jiān)聽編寫一個中秋猜燈謎小游戲

    基于Java事件監(jiān)聽編寫一個中秋猜燈謎小游戲

    眾所周知,JavaSwing是Java中關于窗口開發(fā)的一個工具包,可以開發(fā)一些窗口程序,然后由于工具包的一些限制,導致Java在窗口開發(fā)商并沒有太多優(yōu)勢,不過,在JavaSwing中關于事件的監(jiān)聽機制是我們需要重點掌握的內容,本文將基于Java事件監(jiān)聽編寫一個中秋猜燈謎小游戲
    2023-09-09
  • 解決Java & Idea啟動tomcat的中文亂碼問題

    解決Java & Idea啟動tomcat的中文亂碼問題

    這篇文章主要介紹了Java & Idea啟動tomcat的中文亂碼問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • 線上Java程序占用CPU過高解決方案

    線上Java程序占用CPU過高解決方案

    這篇文章主要介紹了線上Java程序占用CPU過高解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • Java實現(xiàn)限流接口的示例詳解

    Java實現(xiàn)限流接口的示例詳解

    限流是對某一時間窗口內的請求數(shù)進行限制,保持系統(tǒng)的可用性和穩(wěn)定性,防止因流量暴增而導致的系統(tǒng)運行緩慢或宕機,本文主要來和大家聊聊如何使用java實現(xiàn)限流接口,感興趣的可以了解下
    2023-12-12
  • Java中的動態(tài)代理原理及實現(xiàn)

    Java中的動態(tài)代理原理及實現(xiàn)

    這篇文章主要介紹了Java中的動態(tài)代理原理及實現(xiàn),動態(tài)是相對于靜態(tài)而言,何為靜態(tài),即編碼時手動編寫代理類、委托類,而動態(tài)呢,是不編寫具體實現(xiàn)類,等到使用時,動態(tài)創(chuàng)建一個來實現(xiàn)代理的目的,需要的朋友可以參考下
    2023-12-12
  • Java基礎異常處理代碼及原理解析

    Java基礎異常處理代碼及原理解析

    這篇文章主要介紹了java基礎異常處理代碼及原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • Java實現(xiàn)圖片上傳至FastDFS入門教程

    Java實現(xiàn)圖片上傳至FastDFS入門教程

    這篇文章主要介紹了Java實現(xiàn)圖片上傳至FastDFS入門教程,通過前端ajax提交圖片到后端,java處理服務器文件上傳至FastDFS文件服務器系統(tǒng),以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • Springboot使用@WebListener?作為web監(jiān)聽器的過程解析

    Springboot使用@WebListener?作為web監(jiān)聽器的過程解析

    這篇文章主要介紹了Springboot使用@WebListener作為web監(jiān)聽器的過程,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08

最新評論

双江| 靖州| 玉门市| 河北区| 陇西县| 淮阳县| 延寿县| 民丰县| 平阴县| 天津市| 镇赉县| 和平县| 黄山市| 河池市| 息烽县| 大姚县| 霍山县| 永丰县| 疏勒县| 广南县| 英山县| 株洲市| 南漳县| 石渠县| 晴隆县| 蓝山县| 柘荣县| 河间市| 乌审旗| 桃源县| 芮城县| 永城市| 平利县| 海兴县| 民权县| 甘孜| 馆陶县| 定南县| 德钦县| 斗六市| 东山县|