spring security 是針對spring專案的安全框架,也是spring boot底層安全模組預設的技術選型,他可以實現強大的web安全控制,對於安全控制,只需要引入spring-starter-security模組,進行少量的設定,即可實現強大的安全管理。
幾個類:
WebSecurityConfigurerAdapter: 自定義Security策略
AuthenticationManagerBuilder:自定義認證策略
@EnableWebSecurity: 開啟WebSecurity模式,@EnableXXXX開啟某個功能
spring security 的兩個主要目標是「認證」Authentication和「授權「Authorization(存取控制)
這兩個概念相同,不只是在spring security中存在。
只在使用方面比較:
spring security 簡單易用,spring家族天然整合。
shiro屬於阿帕奇,使用較為複雜,設定類較多,但功能強大。
過濾器,攔截器… 需要大量設定,大量判斷,程式碼顯得冗餘。
一個設定類搞定
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。