16.刪除排序連結串列中的重複元素
阿新 • • 發佈:2022-03-10
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功能;
記住我功能
實現記住我的功能,預設儲存兩個星期