spring security 認證與許可權控制

2020-10-29 11:00:58


專案地址:
https://github.com/sevenyoungairye/spring-boot-study/tree/main/springboot-security-06

1. 使用授權和認證的必要性

  1. 什麼是安全框架,幹嘛的
    安全框架,是為了保護web應用,保護使用者的隱私,哪些東西能給別人看,而哪些不能給別人看。給別人看,需要達到哪些條件,比如需要登入,會員等級(充錢)。
  2. 什麼是spring security

spring security 是針對spring專案的安全框架,也是spring boot底層安全模組預設的技術選型,他可以實現強大的web安全控制,對於安全控制,只需要引入spring-starter-security模組,進行少量的設定,即可實現強大的安全管理。

幾個類:

  • WebSecurityConfigurerAdapter: 自定義Security策略

  • AuthenticationManagerBuilder:自定義認證策略

  • @EnableWebSecurity: 開啟WebSecurity模式,@EnableXXXX開啟某個功能

    spring security 的兩個主要目標是「認證」Authentication和「授權「Authorization(存取控制)

    這兩個概念相同,不只是在spring security中存在。

  1. 框架需要做的事
    • 功能許可權(理解為管理員和普通成員對應的功能)
    • 存取許可權(理解為需要授權,登入)
    • 選單許可權 (理解為分角色)

2. spring security 與 shiro 與 過濾器,攔截器

只在使用方面比較:

spring security 簡單易用,spring家族天然整合。
shiro屬於阿帕奇,使用較為複雜,設定類較多,但功能強大。
過濾器,攔截器… 需要大量設定,大量判斷,程式碼顯得冗餘。

3. 具體設定使用

一個設定類搞定

package cn.bitqian.config;

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.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

/**
 * @description spring security test
 * @author echo lovely
 * @date 2020/10/25 19:46
 */

@EnableWebSecurity // 啟用安全框架
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {

    // 授權
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 鏈式程式設計
        http.authorizeRequests().antMatchers("/").permitAll(). // 首頁允許所有人存取
                antMatchers("/level1/**").hasRole("vip1"). // vip1才能存取level1..
                antMatchers("/level2/**").hasRole("vip2").
                antMatchers("/level3/**").hasRole("vip3");

        // 沒有許可權預設會到登入頁面,需要開啟的登入頁面
        // 賬號 密碼 與 表單的name要一致
        http.formLogin().loginPage("/login").loginProcessingUrl("/login"). // 指定一個特殊的頁面登入!
                usernameParameter("username").passwordParameter("password");
        // 支援post請求
        http.csrf().disable();

        // 登出 退出登入到login 頁面
        http.logout().logoutSuccessUrl("/login");

        // 記住我 cookie
        http.rememberMe().rememberMeParameter("remember"); //記住我表單
    }

    // 認證方式
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // 記憶體資料
        auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder()).
                withUser("jack").password(new BCryptPasswordEncoder().encode("123")).roles("vip1", "vip2").
                and().withUser("root").password(new BCryptPasswordEncoder().encode("123")).roles("vip1", "vip2", "vip3").
                and().withUser("guest").password(new BCryptPasswordEncoder().encode("123")).roles("vip1");
    }

}

更多請存取git。