Spring Security is a powerful and highly customizable authentication and access-control framework. It is the de-facto standard for securing Spring-based applications.
spring security 架構
spring security 在web應用中是基於filter的,可以擁有身份驗證與訪問控制的實作(可以想像它是一個實作套件),有安全管理的機制與預設GUI驗證畫面與機制。
Maven配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>sprixmng-boot-starter-security</artifactId>
</dependency>
預設訪問每個端點時,會先導到spring security預設的登入頁。
登入錯誤會顯示
新增一個WebSecurityConfig.java
檔案繼承WebSecurityConfigurerAdapter來設定,
覆寫configure()
的方法設置http security 的參數
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests() // 定義哪些url需要被保護
.antMatchers("/").permitAll() // 定義匹配到"/" 不需要驗證
.antMatchers("/swagger-ui.html").permitAll() // 匹配到"/swagger-ui.html", 不需要身份驗證
.anyRequest().authenticated() // 其他尚未匹配到的url都需要身份驗證
.and()
.formLogin()
.and()
.httpBasic();
}
}
現在嘗試要設定一些角色,先不考慮將角色放置資料庫中,先利用內存來使用
角色ADMIN 可以訪問/demo/user 與 /demo/admin
角色USER 只可以訪問/demo/user
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth)
throws Exception {
// 設置角色定義
auth.inMemoryAuthentication()
.withUser("admin")
.password("123456")
.roles("ADMIN", "USER") // 擁有ADMIN 與 USER角色
.and()
.withUser("user")
.password("123")
.roles("USER");// 擁有USER角色
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests() // 定義哪些url需要被保護
.antMatchers("/user").hasRole("USER")// 定義匹配到"/user"底下的需要有USER的這個角色才能進去
.antMatchers("/admin").hasRole("ADMIN") // 定義匹配到"/admin"底下的需要有ADMIN的這個角色才能進去
.anyRequest().authenticated() // 其他尚未匹配到的url都需要身份驗證
.and()
.formLogin()
.and()
.httpBasic();
}