文章目录

  • 1.Spring Security简介
  • 2.登录权限控制
  • 2.1.基本功能
  • 2.2.登录和未登录导航栏显示
  • 2.3.根据权限显示不同页面功能
  • 3.定制登录页和记住我功能
  • 3.1.定制登录页
  • 3.1.记住我


1.Spring Security简介

Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架。它实际上是保护基于spring的应用程序的标准。

Spring Security是一个框架,侧重于为Java应用程序提供身份验证和授权。与所有Spring项目一样,Spring安全性的真正强大之处在于它可以轻松地扩展以满足定制需求
Spring Security 是针对Spring项目的安全框架,也是Spring Boot底层安全模块默认的技术选型,他可以实现强大的Web安全控制,对于安全控制,我们仅需要引入 spring-boot-starter-security 模块,进行少量的配置,即可实现强大的安全管理!

记住几个类:

  • WebSecurityConfigurerAdapter:自定义Security策略
  • AuthenticationManagerBuilder:自定义认证策略
  • @EnableWebSecurity:开启WebSecurity模式

Spring Security的两个主要目标是 “认证” 和 “授权”(访问控制)。

“认证”(Authentication)

身份验证是关于验证您的凭据,如用户名/用户ID和密码,以验证您的身份。

身份验证通常通过用户名和密码完成,有时与身份验证因素结合使用。

“授权” (Authorization)

授权发生在系统成功验证您的身份后,最终会授予您访问资源(如信息,文件,数据库,资金,位置,几乎任何内容)的完全权限。

这个概念是通用的,而不是只在Spring Security 中存在。

2.登录权限控制

2.1.基本功能

1.引入Spring Security启动器

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

2.编写 Spring Security 配置类

@EnableWebSecurity //开启WebSecurity模式
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //设置请求的授权规则,首页所有人可以访问,level1,2,3分别设置拥有不同权限的人访问
        http.authorizeRequests().antMatchers("/").permitAll()
                .antMatchers("/level1/**").hasRole("vip1")
                .antMatchers("/level2/**").hasRole("vip2")
                .antMatchers("/level3/**").hasRole("vip3");
        //开启自动配置的登录功能,没有权限访问的页面会重定向到登录页面
        http.formLogin();
        http.csrf().disable();//关闭csrf功能:跨站请求伪造,默认只能通过post方式提交logout请求
          //开启了注销功能,注销成功跳转到主页
        http.logout().logoutSuccessUrl("/");
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        //定义认证规则,定义一些拥有权限的角色,可以在内存中定义,也可以到数据库中拿
        //security5.0以上版本新增了许多加密方式,如果不使用加密方式会报500错误。
        auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
                .withUser("zhangxiaofeng").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1")
                .and().withUser("root").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1","vip2","vip3");



    }
}

没有登录的情况下,访问除主页以外的页面会直接重定向到登录页面

spring security怎么进行社交登录 spring security 登录_spring


上面没有用到数据库,这里是官网的关于数据库引用角色的方式。

spring security怎么进行社交登录 spring security 登录_h5_02

2.2.登录和未登录导航栏显示

如果已登录,导航栏显示用户名以及其权限和注销,如果未登录则只显示登录按钮
需要用到thymeleaf功能
先导入thymeleaf和springsecurity的整合包

<!-- https://mvnrepository.com/artifact/org.thymeleaf.extras/thymeleaf-extras-springsecurity4 -->
        <dependency>
            <groupId>org.thymeleaf.extras</groupId>
            <artifactId>thymeleaf-extras-springsecurity5</artifactId>
        </dependency>

前端页面引入命名空间

<!--引入thymeleaf-SpringSecurity的名称空间-->
<html xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/extras/spring-security">

修改导航栏,增加判断

<!--未登录-->
                <div sec:authorize="!isAuthenticated()">
                <a class="item" th:href="@{/login}">
                    <i class="address card icon"></i> 登录
                </a>
                </div>
                <!-- 如果已登录-->
                <div sec:authorize="isAuthenticated()">
                    <a class="item" th:href="@{/login}">
                        <i class="address card icon"></i>
                        用户名:<span sec:authentication="principal.username"></span>
                        角色: <span sec:authentication="principal.authorities"></span>
                    </a>
                </div>
                <div sec:authorize="isAuthenticated()">
                <a class="item" th:href="@{/logout}">
                    <i class="sign-out icon"></i> 注销
                </a>
                </div>

测试

未登录时

spring security怎么进行社交登录 spring security 登录_spring boot_03


已登录时

spring security怎么进行社交登录 spring security 登录_spring boot_04

2.3.根据权限显示不同页面功能

前端页面添加sec:authorize="hasRole(‘status’) 来控制页面展示

<div class="column" sec:authorize="hasRole('vip1')">
                <div class="ui raised segment">
                    <div class="ui">
                        <div class="content">
                            <h5 class="content">Level 1</h5>
                            <hr>
                            <div><a th:href="@{/level1/1}"><i class="bullhorn icon"></i> Level-1-1</a></div>
                            <div><a th:href="@{/level1/2}"><i class="bullhorn icon"></i> Level-1-2</a></div>
                            <div><a th:href="@{/level1/3}"><i class="bullhorn icon"></i> Level-1-3</a></div>
                        </div>
                    </div>
                </div>
            </div>

            <div class="column" sec:authorize="hasRole('vip2')">
                <div class="ui raised segment">
                    <div class="ui">
                        <div class="content">
                            <h5 class="content">Level 2</h5>
                            <hr>
                            <div><a th:href="@{/level2/1}"><i class="bullhorn icon"></i> Level-2-1</a></div>
                            <div><a th:href="@{/level2/2}"><i class="bullhorn icon"></i> Level-2-2</a></div>
                            <div><a th:href="@{/level2/3}"><i class="bullhorn icon"></i> Level-2-3</a></div>
                        </div>
                    </div>
                </div>
            </div>

            <div class="column" sec:authorize="hasRole('vip3')">
                <div class="ui raised segment">
                    <div class="ui">
                        <div class="content">
                            <h5 class="content">Level 3</h5>
                            <hr>
                            <div><a th:href="@{/level3/1}"><i class="bullhorn icon"></i> Level-3-1</a></div>
                            <div><a th:href="@{/level3/2}"><i class="bullhorn icon"></i> Level-3-2</a></div>
                            <div><a th:href="@{/level3/3}"><i class="bullhorn icon"></i> Level-3-3</a></div>
                        </div>
                    </div>
                </div>
            </div>

root角色拥有所有权限显示所有页面

spring security怎么进行社交登录 spring security 登录_h5_05


zhangxiaofneg角色只有vip1权限,所以只显示level1功能

spring security怎么进行社交登录 spring security 登录_spring boot_06

3.定制登录页和记住我功能

3.1.定制登录页

在SecurityConfig中formLogin添加loginPage路径,并且设置用户名和密码的参数和前端name相同。

http.formLogin().loginPage("/toLogin").usernameParameter("username").passwordParameter("password");

修改首页跳转url

<a class="item" th:href="@{/toLogin}">
                    <i class="address card icon"></i> 登录
                </a>

修改form表单提交地址,注意这里的提交方式一定要为post

源码关于这个的说明

spring security怎么进行社交登录 spring security 登录_spring boot_07

<form th:action="@{/toLogin}" method="post">
                            <div class="field">
                                <label>Username</label>
                                <div class="ui left icon input">
                                    <input type="text" placeholder="Username" name="username">
                                    <i class="user icon"></i>
                                </div>
                            </div>
                            <div class="field">
                                <label>Password</label>
                                <div class="ui left icon input">
                                    <input type="password" name="password">
                                    <i class="lock icon"></i>
                                </div>
                            </div>
                            <div class="field">
                                <input type="checkbox" name="remember">记住我
                            </div>
                            <input type="submit" class="ui blue submit button" value="登录"/>
                        </form>

测试:

spring security怎么进行社交登录 spring security 登录_java_08

3.1.记住我

在配置类中添加rememberMe,设置前端参数名。

//开启记住我功能
        http.rememberMe().rememberMeParameter("remember");

选择记住我登录时会增加一个cookie,默认保存14天。下次进入主页时会自动登录,注销后自动删除cookie

spring security怎么进行社交登录 spring security 登录_spring boot_09