1. 程式人生 > 實用技巧 >SpringBoot整合SpringSecurity筆記

SpringBoot整合SpringSecurity筆記

1.新建一個SpringBoot專案,並引入相關依賴

1 <dependency>
2    <groupId>org.thymeleaf</groupId>
3     <artifactId>thymeleaf-spring5</artifactId>
4 </dependency>
5 <dependency>
6     <groupId>org.thymeleaf.extras</groupId>
7     <artifactId>thymeleaf-extras-java8time</artifactId>
8
</dependency>

2.匯入靜態檔案

3.寫Controller層程式碼

package com.sjxy.controller;


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class RouterController {

    @RequestMapping({"/","/index"})
    public String index(){
        return "index";
    }


    @RequestMapping("/toLogin")
    public String login(){
        return "views/login";
    }

    @RequestMapping("/level1/{id}")
    public String level1(@PathVariable("id") Integer id){
        return "views/level1/"+id;
    }
    @RequestMapping("/level2/{id}")
    public String level2(@PathVariable("id") Integer id){
        return "views/level2/"+id;
    }
    @RequestMapping("/level3/{id}")
    public String level3(@PathVariable("id") Integer id){
        return "views/level3/"+id;
    }
}

  

4.配置開啟Security許可權校驗配置類

package com.sjxy.config;


import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

//認證,在SpringBoot2.1.x可以直接使用
//密碼編碼 在SpringSecurity5.0+中新增了很多加密方法
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
.withUser("wnangtao").password(new BCryptPasswordEncoder().encode("123456")).roles("vip2","vip3")
.and()
.withUser("root").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1","vip2","vip3")
.and()
.withUser("guest").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1");

}

@Override
protected void configure(HttpSecurity http) throws Exception {
//授權
http.authorizeRequests()
.antMatchers("/").permitAll()
.antMatchers("/level1/**").hasRole("vip1")
.antMatchers("/level2/**").hasRole("vip2")
.antMatchers("/level3/**").hasRole("vip3");
//若沒有許可權,則跳轉到登入頁面
http.formLogin();
}
}

5.整合Thymeleaf和security包

        <dependency>
            <groupId>org.thymeleaf.extras</groupId>
            <artifactId>thymeleaf-extras-springsecurity4</artifactId>
            <version>3.0.4.RELEASE</version>
        </dependency>
package com.sjxy.config;


import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    //認證,在SpringBoot2.1.x可以直接使用
    //密碼編碼 在SpringSecurity5.0+中新增了很多加密方法
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
                .withUser("wangtao").password(new BCryptPasswordEncoder().encode("123456")).roles("vip2","vip3")
                .and()
                .withUser("root").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1","vip2","vip3")
                .and()
                .withUser("guest").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1");

    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //授權
        http.authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/level1/**").hasRole("vip1")
                .antMatchers("/level2/**").hasRole("vip2")
                .antMatchers("/level3/**").hasRole("vip3");
        //若沒有許可權,則跳轉到登入頁面
//        http.formLogin().loginPage("/toLogin").usernameParameter("user").passwordParameter("pwd").loginPage("/login");//假設使用者名稱和密碼不叫username和password的情況
        http.formLogin().loginPage("/toLogin").loginProcessingUrl("/login");


        //防止網站攻擊csrf
        http.csrf().disable();//關閉csrf功能

        http.logout().logoutSuccessUrl("/");

        http.rememberMe().rememberMeParameter("remember");//記住我 預設存在兩週,可以接收前端頁面傳過來的引數
    }
}

  

 1 <!DOCTYPE html>
 2 <html lang="en" xmlns:th="http://www.thymeleaf.org">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
 6     <title>登入</title>
 7     <!--semantic-ui-->
 8     <link href="https://cdn.bootcss.com/semantic-ui/2.4.1/semantic.min.css" rel="stylesheet">
 9 </head>
10 <body>
11 
12 <!--主容器-->
13 <div class="ui container">
14 
15     <div class="ui segment">
16 
17         <div style="text-align: center">
18             <h1 class="header">登入</h1>
19         </div>
20 
21         <div class="ui placeholder segment">
22             <div class="ui column very relaxed stackable grid">
23                 <div class="column">
24                     <div class="ui form">
25                         <form th:action="@{/login}" method="post">
26                             <div class="field">
27                                 <label>Username</label>
28                                 <div class="ui left icon input">
29                                     <input type="text" placeholder="Username" name="username">
30                                     <i class="user icon"></i>
31                                 </div>
32                             </div>
33                             <div class="field">
34                                 <label>Password</label>
35                                 <div class="ui left icon input">
36                                     <input type="password" name="password">
37                                     <i class="lock icon"></i>
38                                 </div>
39                             </div>
40                             <div class="field">
41                                 <!--此處定義“記住我”,到SecurityConfig中接收-->
42                                 <input type="checkbox" name="remember"/>記住我
43                             </div>
44 
45                             <input type="submit" class="ui blue submit button"/>
46                         </form>
47                     </div>
48                 </div>
49             </div>
50         </div>
51 
52         <div style="text-align: center">
53             <div class="ui label">
54                 </i>註冊
55             </div>
56             <br><br>
57             <small>blog.kuangstudy.com</small>
58         </div>
59         <div class="ui segment" style="text-align: center">
60             <h3>Spring Security Study by 秦疆</h3>
61         </div>
62     </div>
63 
64 
65 </div>
66 
67 <script th:src="@{/qinjiang/js/jquery-3.1.1.min.js}"></script>
68 <script th:src="@{/qinjiang/js/semantic.min.js}"></script>
69 
70 </body>
71 </html>
  1 <!DOCTYPE html>
  2 <html lang="en" xmlns:th="http://www.thymeleaf.org"
  3       xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
  4 <head>
  5     <meta charset="UTF-8">
  6     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  7     <title>首頁</title>
  8     <!--semantic-ui-->
  9     <link href="https://cdn.bootcss.com/semantic-ui/2.4.1/semantic.min.css" rel="stylesheet">
 10     <link th:href="@{/qinjiang/css/qinstyle.css}" rel="stylesheet">
 11 </head>
 12 <body>
 13 
 14 <!--主容器-->
 15 <div class="ui container">
 16 
 17     <div class="ui segment" id="index-header-nav" th:fragment="nav-menu">
 18         <div class="ui secondary menu">
 19             <a class="item"  th:href="@{/index}">首頁</a>
 20 
 21             <div class="right menu">
 22                 <!--未登入,提示登入-->
 23                 <div sec:authorize="!isAuthenticated()">
 24                     <a class="item" th:href="@{/toLogin}">
 25                         <i class="address card icon"></i> 登入
 26                     </a>
 27                 </div>
 28                 <!--已經登入,登出-->
 29                 <div sec:authorize="isAuthenticated()">
 30                     <a class="item" th:href="@{/logout}">
 31                         <i class="sign-out icon"></i> 登出
 32                     </a>
 33                 </div>
 34 
 35                 <!--SpringBoot2.0.9及以下支援thymeleaf中的sec標籤,但是登入頁會變得很醜!-->
 36 
 37                 <!--已經登入,登入名稱和角色-->
 38                 <div sec:authorize="isAuthenticated()">
 39                     <a class="item">
 40                         使用者名稱:<span sec:authentication="name"></span>
 41                     </a>
 42                 </div>
 43 
 44 
 45 
 46                 <!--已登入
 47                 <a th:href="@{/usr/toUserCenter}">
 48                     <i class="address card icon"></i> admin
 49                 </a>
 50                 -->
 51             </div>
 52         </div>
 53     </div>
 54 
 55     <div class="ui segment" style="text-align: center">
 56         <h3>Spring Security Study by 秦疆</h3>
 57     </div>
 58 
 59     <div>
 60         <br>
 61         <div class="ui three column stackable grid">
 62             <div class="column">
 63 <!--                選單根據角色動態修改-->
 64                 <div class="ui raised segment" sec:authorize="hasRole('vip1')">
 65                     <div class="ui">
 66                         <div class="content">
 67                             <h5 class="content">Level 1</h5>
 68                             <hr>
 69                             <div><a th:href="@{/level1/1}"><i class="bullhorn icon"></i> Level-1-1</a></div>
 70                             <div><a th:href="@{/level1/2}"><i class="bullhorn icon"></i> Level-1-2</a></div>
 71                             <div><a th:href="@{/level1/3}"><i class="bullhorn icon"></i> Level-1-3</a></div>
 72                         </div>
 73                     </div>
 74                 </div>
 75             </div>
 76 
 77             <div class="column">
 78                 <div class="ui raised segment">
 79                     <div class="ui">
 80                         <div class="content" sec:authorize="hasRole('vip2')">
 81                             <h5 class="content">Level 2</h5>
 82                             <hr>
 83                             <div><a th:href="@{/level2/1}"><i class="bullhorn icon"></i> Level-2-1</a></div>
 84                             <div><a th:href="@{/level2/2}"><i class="bullhorn icon"></i> Level-2-2</a></div>
 85                             <div><a th:href="@{/level2/3}"><i class="bullhorn icon"></i> Level-2-3</a></div>
 86                         </div>
 87                     </div>
 88                 </div>
 89             </div>
 90 
 91             <div class="column">
 92                 <div class="ui raised segment" sec:authorize="hasRole('vip3')">
 93                     <div class="ui">
 94                         <div class="content">
 95                             <h5 class="content">Level 3</h5>
 96                             <hr>
 97                             <div><a th:href="@{/level3/1}"><i class="bullhorn icon"></i> Level-3-1</a></div>
 98                             <div><a th:href="@{/level3/2}"><i class="bullhorn icon"></i> Level-3-2</a></div>
 99                             <div><a th:href="@{/level3/3}"><i class="bullhorn icon"></i> Level-3-3</a></div>
100                         </div>
101                     </div>
102                 </div>
103             </div>
104 
105         </div>
106     </div>
107     
108 </div>
109 
110 
111 <script th:src="@{/qinjiang/js/jquery-3.1.1.min.js}"></script>
112 <script th:src="@{/qinjiang/js/semantic.min.js}"></script>
113 
114 </body>
115 </html>