天天看點

SpringSecurity自定義登陸

1.簡介

最近在學習SpringSecurity安全架構,在這裡對所學的知識,以及遇見問題進行總結。

2.maven引入jar包

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

3.不做任何配置直接運作項目,他會有預設的登陸頁面以及随機的登陸密碼

SpringSecurity自定義登陸
SpringSecurity自定義登陸

4.目錄結構

SpringSecurity自定義登陸

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"));
    }
}
           

繼續閱讀