亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

一文詳解Spring Security的基本用法

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

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

1.引入依賴

在項(xiàng)目中引入Spring Security依賴,代碼如下:

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

引入依賴后,整個(gè)項(xiàng)目都被Spring Security保護(hù)起來(lái),所有的接口都要登錄之后才能訪問了,例如,我需要訪問/doc.html接口文檔,直接跳到登錄頁(yè)面。如下圖:

這時(shí),你會(huì)有十萬(wàn)個(gè)為什么啦?這個(gè)頁(yè)面哪里的?這個(gè)用戶名和密碼是啥?等等。不著急,聽我一一道來(lái)。

2.用戶名和密碼在哪里設(shè)置

當(dāng)我們引入了Spring Secruity依賴后,啟動(dòng)項(xiàng)目之后,密碼就會(huì)在控制臺(tái)中輸出的,格式是UUID,每一次啟動(dòng)密碼都不一樣的,而用戶名是默認(rèn)是User的。

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

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

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

3.UserDetailsService接口詳解

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

public interface UserDetailsService {

	UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;

}

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

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

3.1JdbcDaoImpl實(shí)現(xiàn)類

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

接著我們?cè)诳匆幌?code>JdbcDaoImpl中的loadUsersByUsername方法,如下:

3.2InMemoryUserDetailsManager實(shí)現(xiàn)類

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

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

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

自定義實(shí)現(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;
    }
}

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

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

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

@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;
    }
}

重啟項(xiàng)目再次測(cè)試,輸入定義的賬號(hào)和密碼。即可訪問到接口文檔頁(yè)面。

4.如何修改登錄頁(yè)面

覺得默認(rèn)的登錄頁(yè)面很丑,我們?nèi)绾味x自己的登錄頁(yè)面呢?方法也很簡(jiǎn)單,首先我們先去準(zhǔn)備一個(gè)登錄頁(yè)面。如下:

前端代碼如下:

<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>

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

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

重新啟動(dòng)項(xiàng)目,輸入定義的用戶名和密碼,登錄成功直接跳轉(zhuǎn)到/doc.html。

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

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

相關(guān)文章

  • Java生成驗(yàn)證碼功能實(shí)例代碼

    Java生成驗(yàn)證碼功能實(shí)例代碼

    頁(yè)面上輸入驗(yàn)證碼是比較常見的一個(gè)功能,實(shí)現(xiàn)起來(lái)也很簡(jiǎn)單.給大家寫一個(gè)簡(jiǎn)單的生成驗(yàn)證碼的示例程序,需要的朋友可以借鑒一下
    2017-05-05
  • java代碼獲取數(shù)據(jù)庫(kù)表里數(shù)據(jù)的總數(shù)操作

    java代碼獲取數(shù)據(jù)庫(kù)表里數(shù)據(jù)的總數(shù)操作

    這篇文章主要介紹了java代碼獲取數(shù)據(jù)庫(kù)表里數(shù)據(jù)的總數(shù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2020-08-08
  • SpringBoot實(shí)現(xiàn)配置文件加密的方案分享

    SpringBoot實(shí)現(xiàn)配置文件加密的方案分享

    項(xiàng)目的數(shù)據(jù)庫(kù)密碼、redis 密碼等明文展示在配置文件中會(huì)有潛在的風(fēng)險(xiǎn),因此采用合適的安全防護(hù)措施是有必要的,下面小編就為大家介紹一下SpringBoot中配置文件加密的方法,希望對(duì)大家有所幫助
    2023-11-11
  • Java實(shí)現(xiàn)在線考試系統(tǒng)與設(shè)計(jì)(學(xué)生功能)

    Java實(shí)現(xiàn)在線考試系統(tǒng)與設(shè)計(jì)(學(xué)生功能)

    這篇文章主要介紹了Java實(shí)現(xiàn)在線考試系統(tǒng)與設(shè)計(jì)(學(xué)生功能),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Java?NIO?通道概念選擇器使用示例詳解

    Java?NIO?通道概念選擇器使用示例詳解

    這篇文章主要為大家介紹了Java?NIO?通道概念選擇器使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • java實(shí)現(xiàn)象棋小游戲

    java實(shí)現(xiàn)象棋小游戲

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)象棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • 一文搞懂Java設(shè)計(jì)模式之責(zé)任鏈模式

    一文搞懂Java設(shè)計(jì)模式之責(zé)任鏈模式

    這篇文章主要給大家介紹了關(guān)于Java設(shè)計(jì)模式之責(zé)任鏈模式的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Mybatis傳遞多個(gè)參數(shù)的解決辦法(三種)

    Mybatis傳遞多個(gè)參數(shù)的解決辦法(三種)

    這篇文章主要介紹了Mybatis傳遞多個(gè)參數(shù)的解決辦法(三種),個(gè)人覺得第三種解決辦法比較好用,有需要的朋友一起學(xué)習(xí)吧
    2016-05-05
  • 分享7款開源Java反編譯工具

    分享7款開源Java反編譯工具

    今天我們要來(lái)分享一些關(guān)于Java的反編譯工具,反編譯聽起來(lái)是一個(gè)非常高上大的技術(shù)詞匯,通俗的說,反編譯是一個(gè)對(duì)目標(biāo)可執(zhí)行程序進(jìn)行逆向分析,從而得到原始代碼的過程。尤其是像.NET、Java這樣的運(yùn)行在虛擬機(jī)上的編程語(yǔ)言,更容易進(jìn)行反編譯得到源代碼
    2014-09-09
  • SpringBoot Jpa 自定義查詢實(shí)現(xiàn)代碼詳解

    SpringBoot Jpa 自定義查詢實(shí)現(xiàn)代碼詳解

    這篇文章主要介紹了SpringBoot Jpa 自定義查詢實(shí)現(xiàn)代碼詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02

最新評(píng)論