常見的兩個安全框架shiro|spring security,這裏只介紹spring security;html
Spring Security是針對Spring項目的安全框架,也是Spring Boot底層安全模塊默認的技術選型。他能夠實現強大的web安全控制。對於安全控制,咱們僅需引入spring-boot-starter-security模塊,進行少許的配置,便可實現強大的安全管理。java
幾個類:
WebSecurityConfigurerAdapter:自定義Security策略
AuthenticationManagerBuilder:自定義認證策略
@EnableWebSecurity:開啓WebSecurity模式web
應用程序的兩個主要區域是「認證」和「受權」(或者訪問控制)。這兩個主要區域是Spring Security 的兩個目標。spring
「認證」(Authentication),是創建一個他聲明的主體的過程(一個「主體」通常是指用戶,設備或一些能夠在你的應用程序中執行動做的其餘系統)瀏覽器
「受權」(Authorization)指肯定一個主體是否容許在你的應用程序執行一個動做的過程。爲了抵達須要受權的店,主體的身份已經有認證過程創建。安全
一、導入依賴springboot
測試環境說明:cookie
springboot:2.2.0、thyemelaf:3.0.11.RELEASE、session
<!--引入spring security模塊--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <!--thyemelaf模塊--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
二、配置spring security配置類框架
該類要用@EnableWebSecurity標註而且繼承WebSecurityConfigurerAdapter
public class MySecurityConfig extends WebSecurityConfigurerAdapter{ }
三、控制請求的訪問權限
重寫protected void configure(HttpSecurity http)方法
定製請求的受權規則:
//開啓自動配置的登陸功能,若是沒有登陸,沒有權限就會來到登陸頁面 /*formLogin() * 一、/login 來到登陸頁面 * 二、重定向到/login?error表示登陸失敗 * 三、更多詳細規定 * 四、默認post形式的/login表明處理登陸 * 五、一旦定製loginpage:那麼loginPage的post請求就是登陸 * */ http.formLogin()
詳細代碼:
@EnableWebSecurity public class MySecurityConfig extends WebSecurityConfigurerAdapter { //定製請求的受權規則 @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests().antMatchers("/").permitAll() .antMatchers("/level1/**").hasRole("VIP1") .antMatchers("/level2/**").hasRole("VIP2") .antMatchers("/level3/**").hasRole("VIP3"); //開啓自動配置的登陸功能,若是沒有登陸,沒有權限就會來到登陸頁面 /*formLogin() * 一、/login 來到登陸頁面 * 二、重定向到/login?error表示登陸失敗 * 三、更多詳細規定 * 四、默認post形式的/login表明處理登陸 * 五、一旦定製loginpage:那麼loginPage的post請求就是登陸 * */ http.formLogin() .usernameParameter("user") .passwordParameter("pwd ") .loginPage("/userlogin"); }
四、定製受權規則
重寫:protected void configure(AuthenticationManagerBuilder auth)
這裏主要從auth.inMemoryAuthentication 從內存中獲取,若是從硬盤查看密碼的話,注意:Spring security 5.0中新增了多種加密方式,也改變了密碼的格式。請看此博客:https://blog.csdn.net/canon_in_d_major/article/details/79675033
@Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { //inMemoryAuthentication 從內存中獲取 auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder()) .withUser("1").password(new BCryptPasswordEncoder().encode("123")).roles("VIP1","VIP2") .and() .withUser("2").password(new BCryptPasswordEncoder().encode("123")).roles("VIP2","VIP3") .and() .withUser("3").password(new BCryptPasswordEncoder().encode("123")).roles("VIP2","VIP3"); }
一、註銷功能
開啓自動配置的註銷功能 一、訪問/loginout表示用戶註銷,清空session 二、註銷成功以後,會返回login?logout
http.logout().logoutSuccessUrl("/");//註銷成功以後來到首頁
html這樣寫:
<form th:action="@{/logout}" method="post"> <input type="submit" value="註銷"> </form>
當頁面點擊註銷按鈕,會跳到登陸頁面,logoutSuccessUrl("/")可到指定位置
二、權限控制
這裏能夠指定特定用戶訪問相對應的信息,不一樣角色顯示不一樣內容
引入thymeleaf-extras-springsecurity5依賴
<!--引入>thymeleaf-extras-springsecurity5--> <dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thymeleaf-extras-springsecurity5</artifactId> <version>3.0.4.RELEASE</version> </dependency>
這裏:記錄springBoot2.2.0版本里添加thymeleaf-extras-springsecurity4後,也沒法正常讀取到sec標籤
html命名空間:
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
便可解決
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h1 align="center">歡迎光臨武林祕籍管理系統</h1> <!--未認證--> <div sec:authorize="!isAuthenticated()"> <h2 align="center">遊客您好,若是想查看武林祕籍 <a th:href="@{/userlogin}">請登陸</a></h2> </div> <!--已認證--> <div sec:authorize="isAuthenticated()"> <h2><span sec:authentication="name"></span>,您好,您的角色有: <span sec:authentication="principal.authorities"></span> </h2> <form th:action="@{/logout}" method="post"> <input type="submit" value="註銷"> </form> </div> <hr> <div sec:authorize="hasRole('VIP1')"> <h3>普通武功祕籍</h3> <ul> <li><a th:href="@{/level1/1}">羅漢拳</a></li> <li><a th:href="@{/level1/2}">武當長拳</a></li> <li><a th:href="@{/level1/3}">全真劍法</a></li> </ul> </div> <div sec:authorize="hasRole('VIP2')"> <h3>高級武功祕籍</h3> <ul> <li><a th:href="@{/level2/1}">太極拳</a></li> <li><a th:href="@{/level2/2}">七傷拳</a></li> <li><a th:href="@{/level2/3}">梯雲縱</a></li> </ul> </div> <div sec:authorize="hasRole('VIP3')"> <h3>絕世武功祕籍</h3> <ul> <li><a th:href="@{/level3/1}">葵花寶典</a></li> <li><a th:href="@{/level3/2}">龜派氣功</a></li> <li><a th:href="@{/level3/3}">獨孤九劍</a></li> </ul> </div> </body> </html>
一、記住我
登陸成功之後,將cookie發給瀏覽器保存,之後訪問頁面會帶上這個cookie,只要經過檢查就能夠實現免登錄,點擊註銷會刪除cookie
/* * 登陸成功之後,將cookie發給瀏覽器保存,之後訪問頁面會帶上這個cookie,只要經過檢查就能夠實現免登錄 * 點擊註銷會刪除cookie * */ http.rememberMe().rememberMeParameter("remember");
二、定製登陸頁
spring security默認訪問/login,
http.formLogin() .usernameParameter("user") .passwordParameter("pwd") .loginPage("/userlogin");
這時候點登陸會到本身定製的登陸頁,這裏要提交登陸的用戶名和密碼 ,loginPage()—>默認post形式的/login表明處理登陸,
一旦定製loginpage:那麼loginPage的post請求就是登陸
登陸頁:
<div align="center"> <form th:action="@{/userlogin}" method="post"> 用戶名:<input name="user"/><br> 密碼:<input name="pwd"><br/> remember me:<input type="checkbox" name="remember"> <input type="submit" value="登錄"> </form> </div>