5.1_springboot2.x與安全(spring security)

一、簡介

常見的兩個安全框架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>
相關文章
相關標籤/搜索