1. 程式人生 > >Spring Security 自定義登入介面

Spring Security 自定義登入介面

一、Spring Security 簡介

Spring 是一個非常流行和成功的 Java 應用開發框架。Spring Security 基於 Spring 框架,提供了一套 Web 應用安全性的完整解決方案。

一般來說,Web 應用的安全性包括使用者認證(Authentication)和使用者授權(Authorization)兩個部分。

使用者認證指的是驗證某個使用者是否為系統中的合法主體,也就是說使用者能否訪問該系統。使用者認證一般要求使用者提供使用者名稱和密碼。系統通過校驗使用者名稱和密碼來完成認證過程。

使用者授權指的是驗證某個使用者是否有許可權執行某個操作。在一個系統中,不同使用者所具有的許可權是不同的。比如對一個檔案來說,有的使用者只能進行讀取,而有的使用者可以進行修改。一般來說,系統會為不同的使用者分配不同的角色,而每個角色則對應一系列的許可權。

#二、pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.xh</groupId>
    <artifactId
>
SpringSecurity-Demo</artifactId> <packaging>war</packaging> <version>1.0.0-SNAPSHOT</version> <name>SpringSecurity-Demo Maven Webapp</name> <url>http://maven.apache.org</url> <dependencyManagement> <dependencies>
<!-- platform與cloud管理版本 --> <dependency> <groupId>io.spring.platform</groupId> <artifactId>platform-bom</artifactId> <version>Brussels-SR11</version> <!-- <version>Cairo-SR2</version> --> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <!-- <version>Dalston.SR2</version> --> <version>Edgware.SR4</version> <!-- <version>Finchley.RELEASE</version> --> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <!-- 與spring security 相關的jar包以及oauth2 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-oauth2</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- commons start --> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> </dependency> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> </dependency> <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> </dependency> <!-- commons end --> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <!-- 原始檔jdk版本 --> <source>1.8</source> <!-- 編譯後jdk版本 --> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> <finalName>SpringSecurity-Demo</finalName> </build> </project>

三、default password

在pom.xml中加入security的依賴後,啟動springboot會自動啟用security,當訪問任何介面的時候會需要登入,例:
s

我訪問 /user 請求就需要登入,其中預設使用者名稱為:user,密碼在啟用springboot的時候,控制檯打印出隨機密碼:
ps

輸入對應密碼就可以訪問介面了:
i

去掉security驗證:在application.properties中加入以下配置:

# close spring security default configration. default username:user
security.basic.enabled = false

但是去掉security攔截,與不加security沒有什麼區別。

四、自定義登入頁面

在原始檔src/main/resources 下面新建resources資料夾,在resources資料夾下面新建登入頁面:myLogin.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登入</title>
</head>
<body>
    <h3>表單登入</h3>
    <form action="/authentication/form" method="post">
        <table>
            <tr>
                <td>使用者名稱:</td> 
                <td><input type="text" name="username"></td>
            </tr>
            <tr>
                <td>密碼:</td>
                <td><input type="password" name="password"></td>
            </tr>
            <tr>
                <td colspan="2"><button type="submit">登入</button></td>
            </tr>
        </table>
    </form>
</body>
</html>

新建class:SecurityConfig 繼承 org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter 重寫 configure(HttpSecurity http) 方法 :

package com.xh.sercurity.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
//      http.httpBasic()// httpBasic 登入
        http.formLogin()// 表單登入  來身份認證
            .loginPage("/myLogin.html")// 自定義登入頁面
            .loginProcessingUrl("/authentication/form")// 自定義登入路徑
            .and()
            .authorizeRequests()// 對請求授權
            // error  127.0.0.1 將您重定向的次數過多
            .antMatchers("/myLogin.html", "/authentication/require",
                    "/authentication/form").permitAll()// 這些頁面不需要身份認證,其他請求需要認證
            .anyRequest() // 任何請求
            .authenticated()//; // 都需要身份認證
            .and()
            .csrf().disable();// 禁用跨站攻擊
    }

}

那麼在訪問介面時需要驗證就會自動跳轉到自定義的登入介面。