zoukankan      html  css  js  c++  java
  • 第十三章:(2)Spring Boot 与 安全 之 SpringBoot + SpringSecurity + Thymeleaf

    一、使用 Spring Security

      1、引入依赖

    <!--security 模块-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>

      2、编写 Spring Security 配置类

    @EnableWebSecurity
    public class MySercurityConfig extends WebSecurityConfigurerAdapter {}

    二、定制授权规则

      定义哪些url由哪些角色可以进行访问:

    @EnableWebSecurity
    public class MySercurityConfig 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");
    
    
            //开启自动配置的登录功能,如果没有登陆,没有权限就会来到登陆页面
            http.formLogin();
            //1、/login 来到登陆页
            //2、重定向到 /login?error 表示登陆失败
            //3、更多详细规定
        }
    }

    三、定制认证规则

      定义用户名,密码和角色:

    @EnableWebSecurity
    public class MySercurityConfig 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");
    
    
            //开启自动配置的登录功能,如果没有登陆,没有权限就会来到登陆页面
            http.formLogin();
            //1、/login 来到登陆页
            //2、重定向到 /login?error 表示登陆失败
            //3、更多详细规定
        }
    
    
        //定义认证规则
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth.inMemoryAuthentication()
                    .withUser("zhangsan").password("123456").roles("VIP1", "VIP2")
                    .and()
                    .withUser("lisi").password("123456").roles("VIP2", "VIP3")
                    .and()
                    .withUser("wangwu").password("123456").roles("VIP1", "VIP3");
        }
    }

    四、注销功能

      开启自动配置的注销功能:

    @EnableWebSecurity
    public class MySercurityConfig 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");
    
    
            //开启自动配置的登录功能,如果没有登陆,没有权限就会来到登陆页面
            http.formLogin();
            //1、/login 来到登陆页
            //2、重定向到 /login?error 表示登陆失败
            //3、更多详细规定
    
    
            //开启自动配置的注销功能
            //1 访问 /logout 表示用户注销,清空 session
            //2.注销成功返回 /login?logout 页面,可以使用 logoutSuccessUrl() 设置注销之后要去的url
            http.logout().logoutSuccessUrl("/");
    
        }
    }

      添加注销按钮

    <form th:action="@{/logout}" method="post">
        <input type="submit" value="注销">
    </form>

    五、权限控制

      1、使用 Thymeleaf 与 SpringSecurity 整合依赖

    <properties>
        <java.version>1.8</java.version>
        <thymeleaf.version>3.0.9.RELEASE</thymeleaf.version>
        <thymeleaf-layout-dialect.version>2.3.0</thymeleaf-layout-dialect.version>
        <thymeleaf-extras-springsecurity4.version>3.0.2.RELEASE</thymeleaf-extras-springsecurity4.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--security 模块-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.thymeleaf.extras</groupId>
            <artifactId>thymeleaf-extras-springsecurity4</artifactId>
        </dependency>
    
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

      2、使用 Thymeleaf 实现权限控制

    <!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>

    六、记住我功能

      开启自动配置的"记住我"功能:

    @EnableWebSecurity
    public class MySercurityConfig 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");
    
    
            //开启自动配置的登录功能,如果没有登陆,没有权限就会来到登陆页面
            http.formLogin();
            //1、/login 来到登陆页
            //2、重定向到 /login?error 表示登陆失败
            //3、更多详细规定
    
    
            //开启自动配置的注销功能
            //1 访问 /logout 表示用户注销,清空 session
            //2.注销成功返回 /login?logout 页面,可以使用 logoutSuccessUrl() 设置注销之后要去的url
            http.logout().logoutSuccessUrl("/");
    
    
            //开启记住我功能
            http.rememberMe();
            //登录成功以后,将 cookie 发送给浏览器保存,以后访问页面带上这个 cookie,只要通过检查就可以免登录
            //点击注销会删除 cookie
    
        }
    }

      通过 cookie 来实现的。

    七、定制登录页面

      自定义登录页面及 "记住我"功能:

    @EnableWebSecurity
    public class MySercurityConfig 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");
    
    
            //开启自动配置的登录功能,如果没有登陆,没有权限就会来到登陆页面
            http.formLogin().usernameParameter("user")
                    .passwordParameter("pwd")
                    .loginPage("/userlogin");
            //1、/login 来到登陆页
            //2、重定向到 /login?error 表示登陆失败
            //3、更多详细规定
            //4. 默认 post 形式的/login代表处理登录
            //5、一旦定制 loginPage,那么 loginPage 的 post 请求就是登录
    
    
            //开启自动配置的注销功能
            //1 访问 /logout 表示用户注销,清空 session
            //2.注销成功返回 /login?logout 页面,可以使用 logoutSuccessUrl() 设置注销之后要去的url
            http.logout().logoutSuccessUrl("/");
    
    
            //开启记住我功能
            http.rememberMe().rememberMeParameter("remember");
            //登录成功以后,将 cookie 发送给浏览器保存,以后访问页面带上这个 cookie,只要通过检查就可以免登录
            //点击注销会删除 cookie
    
        }
    
    
        //定义认证规则
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth.inMemoryAuthentication()
                    .withUser("zhangsan").password("123456").roles("VIP1", "VIP2")
                    .and()
                    .withUser("lisi").password("123456").roles("VIP2", "VIP3")
                    .and()
                    .withUser("wangwu").password("123456").roles("VIP1", "VIP3");
        }
    }

      定义控制器方法:

        /**
         * 登陆页
         * @return
         */
        @GetMapping("/userlogin")
        public String loginPage() {
            return PREFIX+"login";
        }

      定义登录页面:

    <!DOCTYPE html>
    <html xmlns:th="http://www.thymeleaf.org">
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        <h1 align="center">欢迎登陆武林秘籍管理系统</h1>
        <hr>
        <div align="center">
            <form th:action="@{/userlogin}" method="post">
                用户名:<input name="user"/><br>
                密码:<input name="pwd"><br/>
                <input type="checkbox" name="remember">记住我<br/>
                <input type="submit" value="登陆">
            </form>
        </div>
    </body>
    </html>

      修改登录地址:

    <div sec:authorize="!isAuthenticated()">
        <!--没有认证-->
        <h2 align="center">游客您好,如果想查看武林秘籍 <a th:href="@{/userlogin}">请登录</a></h2>
    </div>
  • 相关阅读:
    关于按钮背景透明 + div拖拽
    asp.net 自带ajax 控件的小实例
    何去何从
    字符串的常用操作
    第一章
    C语言的基础知识2
    C语言的基础知识1
    socket
    缓冲区溢出学习
    OD调试
  • 原文地址:https://www.cnblogs.com/niujifei/p/15772717.html
Copyright © 2011-2022 走看看