javascript
Spring Security实现登录权限控制,记住我等功能
文章目錄
- 1.Spring Security簡介
- 2.登錄權限控制
- 2.1.基本功能
- 2.2.登錄和未登錄導航欄顯示
- 2.3.根據權限顯示不同頁面功能
- 3.定制登錄頁和記住我功能
- 3.1.定制登錄頁
- 3.1.記住我
1.Spring Security簡介
Spring Security是一個功能強大且高度可定制的身份驗證和訪問控制框架。它實際上是保護基于spring的應用程序的標準。
Spring Security是一個框架,側重于為Java應用程序提供身份驗證和授權。與所有Spring項目一樣,Spring安全性的真正強大之處在于它可以輕松地擴展以滿足定制需求
Spring Security 是針對Spring項目的安全框架,也是Spring Boot底層安全模塊默認的技術選型,他可以實現強大的Web安全控制,對于安全控制,我們僅需要引入 spring-boot-starter-security 模塊,進行少量的配置,即可實現強大的安全管理!
記住幾個類:
- WebSecurityConfigurerAdapter:自定義Security策略
-
AuthenticationManagerBuilder:自定義認證策略
-
@EnableWebSecurity:開啟WebSecurity模式
Spring Security的兩個主要目標是 “認證” 和 “授權”(訪問控制)。
“認證”(Authentication)
身份驗證是關于驗證您的憑據,如用戶名/用戶ID和密碼,以驗證您的身份。
身份驗證通常通過用戶名和密碼完成,有時與身份驗證因素結合使用。
“授權” (Authorization)
授權發生在系統成功驗證您的身份后,最終會授予您訪問資源(如信息,文件,數據庫,資金,位置,幾乎任何內容)的完全權限。
這個概念是通用的,而不是只在Spring Security 中存在。
2.登錄權限控制
2.1.基本功能
1.引入Spring Security啟動器
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId> </dependency>2.編寫 Spring Security 配置類
@EnableWebSecurity //開啟WebSecurity模式 public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {//設置請求的授權規則,首頁所有人可以訪問,level1,2,3分別設置擁有不同權限的人訪問http.authorizeRequests().antMatchers("/").permitAll().antMatchers("/level1/**").hasRole("vip1").antMatchers("/level2/**").hasRole("vip2").antMatchers("/level3/**").hasRole("vip3");//開啟自動配置的登錄功能,沒有權限訪問的頁面會重定向到登錄頁面http.formLogin();http.csrf().disable();//關閉csrf功能:跨站請求偽造,默認只能通過post方式提交logout請求//開啟了注銷功能,注銷成功跳轉到主頁http.logout().logoutSuccessUrl("/");}@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {//定義認證規則,定義一些擁有權限的角色,可以在內存中定義,也可以到數據庫中拿//security5.0以上版本新增了許多加密方式,如果不使用加密方式會報500錯誤。auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder()).withUser("zhangxiaofeng").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1").and().withUser("root").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1","vip2","vip3");} }沒有登錄的情況下,訪問除主頁以外的頁面會直接重定向到登錄頁面
上面沒有用到數據庫,這里是官網的關于數據庫引用角色的方式。
2.2.登錄和未登錄導航欄顯示
如果已登錄,導航欄顯示用戶名以及其權限和注銷,如果未登錄則只顯示登錄按鈕
需要用到thymeleaf功能
先導入thymeleaf和springsecurity的整合包
前端頁面引入命名空間
<!--引入thymeleaf-SpringSecurity的名稱空間--> <html xmlns:th="http://www.thymeleaf.org"xmlns:sec="http://www.thymeleaf.org/extras/spring-security">修改導航欄,增加判斷
<!--未登錄--><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" th:href="@{/login}"><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="sign-out icon"></i> 注銷</a></div>測試
未登錄時
已登錄時
2.3.根據權限顯示不同頁面功能
前端頁面添加sec:authorize="hasRole(‘status’) 來控制頁面展示
<div class="column" sec:authorize="hasRole('vip1')"><div class="ui raised segment"><div class="ui"><div class="content"><h5 class="content">Level 1</h5><hr><div><a th:href="@{/level1/1}"><i class="bullhorn icon"></i> Level-1-1</a></div><div><a th:href="@{/level1/2}"><i class="bullhorn icon"></i> Level-1-2</a></div><div><a th:href="@{/level1/3}"><i class="bullhorn icon"></i> Level-1-3</a></div></div></div></div></div><div class="column" sec:authorize="hasRole('vip2')"><div class="ui raised segment"><div class="ui"><div class="content"><h5 class="content">Level 2</h5><hr><div><a th:href="@{/level2/1}"><i class="bullhorn icon"></i> Level-2-1</a></div><div><a th:href="@{/level2/2}"><i class="bullhorn icon"></i> Level-2-2</a></div><div><a th:href="@{/level2/3}"><i class="bullhorn icon"></i> Level-2-3</a></div></div></div></div></div><div class="column" sec:authorize="hasRole('vip3')"><div class="ui raised segment"><div class="ui"><div class="content"><h5 class="content">Level 3</h5><hr><div><a th:href="@{/level3/1}"><i class="bullhorn icon"></i> Level-3-1</a></div><div><a th:href="@{/level3/2}"><i class="bullhorn icon"></i> Level-3-2</a></div><div><a th:href="@{/level3/3}"><i class="bullhorn icon"></i> Level-3-3</a></div></div></div></div></div>root角色擁有所有權限顯示所有頁面
zhangxiaofneg角色只有vip1權限,所以只顯示level1功能
3.定制登錄頁和記住我功能
3.1.定制登錄頁
在SecurityConfig中formLogin添加loginPage路徑,并且設置用戶名和密碼的參數和前端name相同。
http.formLogin().loginPage("/toLogin").usernameParameter("username").passwordParameter("password");修改首頁跳轉url
<a class="item" th:href="@{/toLogin}"><i class="address card icon"></i> 登錄</a>修改form表單提交地址,注意這里的提交方式一定要為post
源碼關于這個的說明
測試:
3.1.記住我
在配置類中添加rememberMe,設置前端參數名。
//開啟記住我功能http.rememberMe().rememberMeParameter("remember");選擇記住我登錄時會增加一個cookie,默認保存14天。下次進入主頁時會自動登錄,注銷后自動刪除cookie
總結
以上是生活随笔為你收集整理的Spring Security实现登录权限控制,记住我等功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自定义LocaleResolver实现页
- 下一篇: Springbooot集成Shiro简单