1.簡介
最近在學習SpringSecurity安全架構,在這裡對所學的知識,以及遇見問題進行總結。
2.maven引入jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
3.不做任何配置直接運作項目,他會有預設的登陸頁面以及随機的登陸密碼
4.目錄結構
5.登陸頁面
<form action="/login" method="post">
<label for="name">使用者名:<input type="text" id="name" name="username" value="admin"></label>
<label for="pass">密碼:<input type="text" id="pass" name="password" value="123456"></label>
<input type="submit" value="登陸">
</form>
6.loginController.java
@RestController
public class LoginController {
@RequestMapping("succ")
public String succ(){
return "index.html";
}
@RequestMapping("fail")
public String fail(){
return "fail.html";
}
}
7.配置自己的登陸頁面
繼承WebSecurityConfigurerAdapter 類
重寫configure(HttpSecurity http) 方法
.csrf().disable()必須加不然會包302錯誤,會一直重定向登陸頁面
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
//方向頁面或接口
.antMatchers("/login.html").permitAll()
.antMatchers("/fail.html").permitAll().
//所有頁面都必須認證登陸
.anyRequest().authenticated()
.and()
.formLogin()
//自定義登陸界面
.loginPage("/login.html")
//頁面登陸時跳轉的登陸方法、和我自己寫的Controller沒有關系
//必須和表單的action="/login" 位址一樣
//自定義登陸邏輯 登陸時走這個路口
.loginProcessingUrl("/login")
//成功跳轉 必須是post方式
.successForwardUrl("/succ")
//失敗跳轉 必須是post方式
.failureForwardUrl("/fail")
//自定義登陸參數
//.usernameParameter("")
//.passwordParameter("");
.and()
//關閉srf防護
.csrf().disable();
}
@Bean
public PasswordEncoder pw(){
return new BCryptPasswordEncoder();
}
8.更改登陸邏輯
@Service
public class UserServiceImpl implements UserDetailsService {
@Autowired
private PasswordEncoder pw;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
System.out.println("sdafdsfsadfsafdsd");
//1.根據username查詢資料庫
if(!"admin".equals(username)){
throw new UsernameNotFoundException("使用者名或密碼錯誤");
}
//2.根據查詢的對象比較密碼
String password = pw.encode("123456");
//3.傳回使用者對象
return new User("admin",password, AuthorityUtils
.commaSeparatedStringToAuthorityList("admin,aa"));
}
}