91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring?Security怎么使用

發布時間:2022-05-20 09:15:44 來源:億速云 閱讀:286 作者:iii 欄目:開發技術

這篇文章主要介紹“Spring Security怎么使用”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Spring Security怎么使用”文章能幫助大家解決問題。

    Spring Security是一個功能強大且高度可定制的身份驗證和訪問控制框架, 提供了完善的認證機制和方法級的授權功能。是一款非常優秀的權限管理框架。它的核心是一組過濾器鏈,不同的功能經由不同的過濾器。 

    1.引入依賴

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

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

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

    Spring?Security怎么使用

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

    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框架提供了它的實現類org.springframework.security.core.userdetails包下的User類對象 。userdetails源碼如下:

    Spring?Security怎么使用

    Spring Security提供了三個UserDetailsService接口的實現類,分別是CachingUserDetailsServiceJdbcDaoImplInMemoryUserDetailsManager

    3.1JdbcDaoImpl實現類

    Spring?Security怎么使用

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

    Spring?Security怎么使用

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

    Spring?Security怎么使用

    3.2InMemoryUserDetailsManager實現類

    Spring?Security怎么使用

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

    Spring?Security怎么使用

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

    3.3自定義實現類實現UserDetailsService接口

    自定義實現類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;
        }
    }

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

    Spring?Security怎么使用

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

    Spring?Security怎么使用

    把這個PasswordEncoder的任意一個我們需要用來加密密碼的實現類的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;
        }
    }

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

    Spring?Security怎么使用

    4.如何修改登錄頁面

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

    Spring?Security怎么使用

    前端代碼如下:

    <form action="/login" class="login-form" >
        <h2>登錄</h2>
    
        <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怎么使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    资阳市| 迁西县| 尼木县| 会宁县| 瑞安市| 裕民县| 喜德县| 江山市| 乌鲁木齐市| 新余市| 安泽县| 肥城市| 台中市| 香河县| 桐城市| 泌阳县| 永州市| 万源市| 佛冈县| 平邑县| 连城县| 抚顺市| 乡宁县| 中卫市| 芒康县| 望江县| 中阳县| 丽江市| 磐安县| 专栏| 古丈县| 苏尼特左旗| 额敏县| 南召县| 明水县| 广汉市| 博乐市| 建阳市| 那坡县| 陇南市| 乌苏市|