zoukankan      html  css  js  c++  java
  • springboot+springsecurity+thymeleaf

    来源:听秦疆老师的课笔记

    springsecurity是一个权限管理框架,用来授权,认证,加密等等......类似的工具还有shiro

    1.整合

      我用的是springboot2.2.0版本,导入以下依赖。

      spring和security整合包我用的版本是thymeleaf-extras-springsecurity5,
      老师用的是thymeleaf-extras-springsecurity4
      如果使用thymeleaf-extras-springsecurity4,需要将springboot的版本调低至2.0.9及以下
      springbo
    ot和springsecurity版本不匹配,会产生thymeleaf和security联合使用不生效问题
     1 <dependencies>
     2 
     3         <dependency>
     4             <groupId>org.springframework.boot</groupId>
     5             <artifactId>spring-boot-starter-thymeleaf</artifactId>
     6         </dependency>
     7 
     8         <dependency>
     9             <groupId>org.springframework.boot</groupId>
    10             <artifactId>spring-boot-starter-security</artifactId>
    11         </dependency>
    12         <!-- thymeleaf和Security整合依赖 -->
    13         <dependency>
    14             <groupId>org.thymeleaf.extras</groupId>
    15             <artifactId>thymeleaf-extras-springsecurity5</artifactId>
    16             <version>3.0.3.RELEASE</version>
    17         </dependency>
    18 
    19         <dependency>
    20             <groupId>org.springframework.boot</groupId>
    21             <artifactId>spring-boot-starter-web</artifactId>
    22         </dependency>
    23 
    24         <dependency>
    25             <groupId>org.springframework.boot</groupId>
    26             <artifactId>spring-boot-starter-test</artifactId>
    27             <scope>test</scope>
    28             <exclusions>
    29                 <exclusion>
    30                     <groupId>org.junit.vintage</groupId>
    31                     <artifactId>junit-vintage-engine</artifactId>
    32                 </exclusion>
    33             </exclusions>
    34         </dependency>
    35     </dependencies>
    View Code

    2.配置使用

      使用方式十分简单,用一个类继承WebSecurityConfigurerAdapter并重写方法即可

       不要忘记使用@EnableWebSecurity开启服务,交给spring管理

        

     1 /**
     2  * @author Silent
     3  * @date 2019/11/13 17:12:38
     4  * @description  @EnableWebSecurity 开启服务
     5  * 1.授权
     6  * 2.认证
     7  */
     8 @EnableWebSecurity
     9 public class SecurityConfig extends WebSecurityConfigurerAdapter {
    10     /**
    11      *
    12      * @param http
    13      * @throws Exception
    14      * 授权:首页所有人可以访问,功能页只有对应有权限的人才能访问
    15      */
    16     @Override
    17     protected void configure(HttpSecurity http) throws Exception {
    18         // 请求授权的规则~
    19         http.authorizeRequests()
    20                 .antMatchers("/").permitAll()
    21                 .antMatchers("/level1/**").hasRole("vip1")
    22                 .antMatchers("/level2/**").hasRole("vip2")
    23                 .antMatchers("/level3/**").hasRole("vip3");
    24         // 没有权限默认会到登录页面(security内置的登录页面),需要开启登录页面
    25         //定制登录页面loginPage("/toLogin")
    26         //默认表单name用户名是username,密码是password,自己定义需要usernameParameter("username").passwordParameter("password")
    27         //loginProcessingUrl("/login");参数“login”与登录表单的action保持一致
    28         /**
    29          * 如果只配置loginPage而不配置loginProcessingUrl的话
    30          * 那么loginProcessingUrl默认就是loginPage
    31          * 你配置的loginPage("/toLogin") ,那么loginProcessingUrl就是"/toLogin",相应的action也改为“/toLogin”
    32          */
    33         http.formLogin().loginPage("/toLogin")
    34                 .usernameParameter("username").passwordParameter("password")
    35                 .loginProcessingUrl("/login");
    36         //防止网站攻击 csrf,阻止get,
    37         http.csrf().disable();//关闭csrf功能,解决登录失败
    38         //开启注销功能,跳到首页
    39         http.logout().logoutSuccessUrl("/");
    40         //开启记住我功能,cookies默认保存两周,自定义接受前端参数
    41         http.rememberMe().rememberMeParameter("remember");
    42 
    43     }
    44 
    45     //认证, springboot 2.1.x可以直接使用
    46 
    47     @Override
    48     protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    49         //正常的话,这些数据应该从数据库读取 这里写入内存
    50         auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
    51                 .withUser("silent").password(new BCryptPasswordEncoder().encode("123456")).roles("vip2","vip3")
    52                 .and()
    53                 .withUser("root").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1","vip2","vip3")
    54                 .and()
    55                 .withUser("guest").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1");
    56     }
    57 
    58 }

    3.在thymeleaf中使用springsecurity

      sec:authorize :判断信息是否存在

        sec:authentication:取出相应的值

      1 <!DOCTYPE html>
      2 <html lang="en" xmlns:th="http://www.thymeleaf.org"
      3       xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5">
      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             <!--登录注销-->
     22             <div class="right menu">
     23                 <!--未登录-->
     24                 <div sec:authorize="!isAuthenticated()">
     25                     <a class="item" th:href="@{/toLogin}" >
     26                         <i class="address card icon"></i> 登录
     27 
     28                     </a>
     29                 </div>
     30                 <!--已登录 -->
     31                 <div sec:authorize="isAuthenticated()">
     32                     <a class="item">
     33                         用户名:<span sec:authentication="name"></span>
     34                         角色: <span sec:authentication="principal.authorities"></span>
     35                     </a>
     36                 </div>
     37                 <div sec:authorize="isAuthenticated()">
     38                     <a class="item" th:href="@{/logout}" >
     39                         <i class="sign-out icon"></i> 注销
     40                     </a>
     41                 </div>
     42 
     43             </div>
     44         </div>
     45     </div>
     46 
     47     <div class="ui segment" style="text-align: center">
     48         <h3>Spring Security Study by 秦疆</h3>
     49     </div>
     50 
     51     <div>
     52         <br>
     53         <div class="ui three column stackable grid">
     54             <div class="column"  sec:authorize="hasRole('vip1')">
     55                 <div class="ui raised segment">
     56                     <div class="ui">
     57                         <div class="content">
     58                             <h5 class="content">Level 1</h5>
     59                             <hr>
     60                             <div><a th:href="@{/level1/1}"><i class="bullhorn icon"></i> Level-1-1</a></div>
     61                             <div><a th:href="@{/level1/2}"><i class="bullhorn icon"></i> Level-1-2</a></div>
     62                             <div><a th:href="@{/level1/3}"><i class="bullhorn icon"></i> Level-1-3</a></div>
     63                         </div>
     64                     </div>
     65                 </div>
     66             </div>
     67 
     68             <div class="column"  sec:authorize="hasRole('vip2')">
     69                 <div class="ui raised segment">
     70                     <div class="ui">
     71                         <div class="content">
     72                             <h5 class="content">Level 2</h5>
     73                             <hr>
     74                             <div><a th:href="@{/level2/1}"><i class="bullhorn icon"></i> Level-2-1</a></div>
     75                             <div><a th:href="@{/level2/2}"><i class="bullhorn icon"></i> Level-2-2</a></div>
     76                             <div><a th:href="@{/level2/3}"><i class="bullhorn icon"></i> Level-2-3</a></div>
     77                         </div>
     78                     </div>
     79                 </div>
     80             </div>
     81 
     82             <div class="column"  sec:authorize="hasRole('vip3')">
     83                 <div class="ui raised segment">
     84                     <div class="ui">
     85                         <div class="content">
     86                             <h5 class="content">Level 3</h5>
     87                             <hr>
     88                             <div><a th:href="@{/level3/1}"><i class="bullhorn icon"></i> Level-3-1</a></div>
     89                             <div><a th:href="@{/level3/2}"><i class="bullhorn icon"></i> Level-3-2</a></div>
     90                             <div><a th:href="@{/level3/3}"><i class="bullhorn icon"></i> Level-3-3</a></div>
     91                         </div>
     92                     </div>
     93                 </div>
     94             </div>
     95 
     96         </div>
     97     </div>
     98     
     99 </div>
    100 
    101 
    102 <script th:src="@{/qinjiang/js/jquery-3.1.1.min.js}"></script>
    103 <script th:src="@{/qinjiang/js/semantic.min.js}"></script>
    104 
    105 </body>
    106 </html>
    View Code

     https://github.com/Sevenwsq/springsecurity-demo/tree/springsecurity-demo 项目地址

  • 相关阅读:
    MySQL的安装问题
    初识二分法
    PK赛 lower_bound( )和upper_bound( )的应用
    记录
    "双指针"去重有序数组
    归并排序(循序渐进中......)
    [2021.4.20打卡]LeetCode781. 森林中的兔子
    杂记...(持续更新)
    [未完待续](c++实现)八数码Ⅱ
    [回忆向]快速排序(降序) 感悟
  • 原文地址:https://www.cnblogs.com/seekknowledge/p/11854132.html
Copyright © 2011-2022 走看看