1. 程式人生 > 其它 >騰訊雲伺服器Ubuntu在docker部署springboot+mysql

騰訊雲伺服器Ubuntu在docker部署springboot+mysql


Spring Security是一個功能強大且高度可定製的身份驗證和訪問控制框架。


環境搭建


1)匯入Thymeleaf模組

2)匯入靜態資源

3)controller跳轉

@Controller
public class RouterController {

    @RequestMapping({"/","/index"})
    public String index(){
        return "index";
    }

    @RequestMapping("/tologin")
    public String toLogin(){
        return "views/login";
    }

    @RequestMapping("/level1/{id}")
    public String level1(@PathVariable("id") int id){
        return "views/level1/"+id;
    }

    @RequestMapping("/level2/{id}")
    public String level2(@PathVariable("id") int id){
        return "views/level2/"+id;
    }

    @RequestMapping("/level3/{id}")
    public String level3(@PathVariable("id") int id){
        return "views/level3/"+id;
    }

}

使用者認證和授權


記住幾個類:

  • WebSecurityConfigurerAdapter:自定義Security策略

  • AuthenticationManagerBuilder:自定義認證策略

  • @EnableWebSecurity:開啟WebSecurity模式

Spring Security的兩個主要目標是 “認證”(Authentication) 和 “授權”(Authorization)


1)引入 spring-boot-starter-security 模組

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

2)編寫 Spring Security 配置類

參考官網:https://spring.io/projects/spring-security

SecurityConfig:

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {


    //授權
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //首頁所有人都可以訪問,功能頁只有對應的使用者才能訪問
        //在記憶體中定義,也可以在jdbc中去拿....
        http.authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/level1/**").hasRole("vip1")
                .antMatchers("/level2/**").hasRole("vip2")
                .antMatchers("/level3/**").hasRole("vip3");

        //沒有許可權預設會到登入頁面
        http.formLogin();

        //開啟登出功能,登出後跳到首頁並且移除cookie和session
        // .logoutSuccessUrl("/"); 登出成功來到首頁
        http.logout().deleteCookies("remove").invalidateHttpSession(false).logoutUrl("/");
    }



    //認證
    //在spring security5.0+中 新增了很多的加密方式
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {

        //這些資料正常情況下在資料庫裡讀取
        auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
                .withUser("kaka").password(new BCryptPasswordEncoder().encode("123456")).roles("vip2","vip3")
                .and()
                .withUser("haha").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1");
    }
}

許可權控制


我們現在又來一個需求:使用者沒有登入的時候,導航欄上只顯示登入按鈕,使用者登入之後,導航欄可以顯示登入的使用者資訊及登出按鈕!還有就是,比如kuangshen這個使用者,它只有 vip2,vip3功能,那麼登入則只顯示這兩個功能,而vip1的功能選單不顯示.


  • 我們需要結合thymeleaf中的一些功能

  • sec:authorize="isAuthenticated()":是否認證登入!來顯示不同的頁面

  • 匯入thymeleaf和springboot整合的包:

<!-- https://mvnrepository.com/artifact/org.thymeleaf.extras/thymeleaf-extras-springsecurity5 -->
<dependency>
    <groupId>org.thymeleaf.extras</groupId>
    <artifactId>thymeleaf-extras-springsecurity5</artifactId>
    <version>3.0.4.RELEASE</version>
</dependency>


  • 修改前端頁面如下:
匯入名稱空間:  
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5"

<!--登入登出-->
<div class="right menu">

   <!--如果未登入-->
   <div sec:authorize="!isAuthenticated()">
       <a class="item" th:href="@{/login}">
           <i class="address card icon"></i> 登入
       </a>
   </div>

   <!--如果已登入-->
   <div sec:authorize="isAuthenticated()">
       <a class="item">
           <i class="address card icon"></i>
          使用者名稱:<span sec:authentication="principal.username"></span>
          角色:<span sec:authentication="principal.authorities"></span>
       </a>
   </div>

   <div sec:authorize="isAuthenticated()">
       <a class="item" th:href="@{/logout}">
           <i class="address card icon"></i> 登出
       </a>
   </div>
</div>
  • 如果登出404了,就是因為它預設防止csrf跨站請求偽造,因為會產生安全問題,我們可以將請求改為post表單提交,或者在spring security中關閉csrf功能;

記住我功能


實現記住我的功能,預設儲存兩個星期