Spring Security-2-表单认证

简介: 我们在地址小节介绍了Spring Security的HttpBasic基础认证模式,这个模式方法比较简单,不需要制作登录页面,使用范围较小。如果我们在一个完整的系统里面,登录页面也许我们自己设计,并且提供多种登录方式。这就需要使用Spring Security为我们提供的表单登录进行登录认证

Spring Security-2-表单认证


我们在地址小节介绍了Spring Security的HttpBasic基础认证模式,这个模式方法比较简单,不需要制作登录页面,使用范围较小。如果我们在一个完整的系统里面,登录页面也许我们自己设计,并且提供多种登录方式。这就需要使用Spring Security为我们提供的表单登录进行登录认证


项目代码准备

Controller层代码

@Controller
public class TestController {
    /**
     * 登录
     * @return
     */
    @RequestMapping("/login/page")
    public String toLogin() {
        return "login"; // classpath: /templates/login.html
    }
    // 首页
    @RequestMapping({"/index", "/", ""})
    public String index() {
        return "index";
    }
    // 日志管理
    @GetMapping("/syslog")
    @ResponseBody
    public String showOrder() {
        return "springboot葵花宝典 syslog";
    }
    // 用户管理
    @GetMapping("/sysuser")
    @ResponseBody
    public String addOrder() {
        return "springboot葵花宝典  sysuser";
    }
}



index.html

我们设置一个简单的index.html页面,代码如下

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8" />
    <title>springboot葵花宝典管理系统</title>
</head>
<body>
<h1>springboot葵花宝典管理系统</h1>
<br>
<a href="/syslog">日志管理</a>
<br>
<a href="/sysuser">用户管理</a>


启动浏览器输入http://localhost:8888/,显示页面如下



如果我们想在页面的时候添加登录页面和权限,那么我们要实现以下步骤。

添加Spring Security启动依赖

要在我们创建项目的pom.xml中添加spring-boot-starter-security依赖

        <!--spring security-->
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-security -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
            <version>2.6.4</version>
        </dependency>



创建LearnSrpingSecurity安全配置类

LearnSrpingSecurity安全配置类作为我们的安全控制中心,具体实现步骤如下:



创建LearnSrpingSecurity类在config包下


让LearnSrpingSecurity继承WebSecurityConfigurerAdapter


在LearnSrpingSecurity类上添加@EnableWebSecurity注解


重写以下两个方法


configure(AuthenticationManagerBuilder auth) 认证管理器


认证信息提供方式(用户名、密码、当前用户的资源权限)


可采用内存存储方式,也可能采用数据库方式等


configure(HttpSecurity http) 资源权限配置(过滤器链)


被拦截资源


资源对应的权限


认证方式:httpbasic、httpform


定制登录页面、登录请求地址,以及成功和失败处理方式


自定义 spring security 过滤器


c6ad3d2dfe38cd9115b7215cf5f11d31.png

/**
 * 安全配置类
 */
@EnableWebSecurity
public class LearnSrpingSecurity extends WebSecurityConfigurerAdapter {
    /**
     * 认证管理器
     * 1.认证信息提供方式(用户名、密码、当前用户的资源权限)
     * 2.可采用内存存储方式,也可能采用数据库方式等
     * @param auth
     * @throws Exception
     */
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        super.configure(auth);
    }
    /**
     * 资源权限配置(过滤器链):
     * 1、被拦截的资源
     * 2、资源所对应的角色权限
     * 3、定义认证方式:httpBasic 、httpForm
     * 4、定制登录页面、登录请求地址、错误处理方式
     * 5、自定义 spring security 过滤器
     * @param http
     * @throws Exception
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.formLogin()//表单认证
            .and()
            .authorizeRequests()
            .anyRequest().authenticated();
    }
}

现在我们启动程序并输入http://localhost:8080/我们发现页面像httpbasic一样自动跳转到了http://localhost:8080/login,用户名和密码还是像之前一样

  • 用户名默认 user
  • 密码 自动生成

58e9d6dfc6dd70b30e42b3118a420520.png


输入用户和密码后就看显示原来的页面信息

@EnableSecurity注解解释


我们添加@EnableWebSecurity注解是为了让LearnSrpingSecurity类被Spring发现并进行注册,为什么添加上这个注解就会被Spring发现并注册呢?,我们查看@EnableWebSecurity源码发现,EnableWebSecurity注解标注了@Configuration注解

@Configuration
public @interface EnableWebSecurity {
    boolean debug() default false;
}

用户角色配置

如果我们需要自定义用户和密码,可以在configure(AuthenticationManagerBuilder auth) 认证管理器中进行实现,提供了内存和数据库等存储用户信息的方式,具体代码实现如下


内存管理用户信息

    @Bean
    public PasswordEncoder passwordEncoder(){
        return  new BCryptPasswordEncoder();
    }
    /**
     * 认证管理器
     * 1.认证信息提供方式(用户名、密码、当前用户的资源权限)
     * 2.可采用内存存储方式,也可能采用数据库方式等
     * @param auth
     * @throws Exception
     */
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        //super.configure(auth);
        auth.inMemoryAuthentication()
                .withUser("admin")
                .password(passwordEncoder().encode("123456"))
                .roles("admin")
                .authorities("Role_admin")
                .and()
                .passwordEncoder(passwordEncoder());//配置BCrypt加密
    }



inMemoryAuthentication:使用内存存储用户信息


withUser:设置用户名


password:设置用户密码,在设置密码的时候必须注入PasswordEncoder


authorities: 是对应用户拥有资源ID对应的资源访问的的权限


roles:方法用于指定用户的角色,一个用户可以有多个角色


现在我们启动程序并输入http://localhost:8080/,页面还是会自动跳转到http://localhost:8888/login,输入我们自定的用户名和密码


6a7bea8b6f50bbcd1573893f8dc3d955.png


自定义登录页面


当我们设置了用户名和密码以后,我们肯定还想设置一个自己的登录页面,我们需要将自定义登录页面需要放置在src\main\resources\static文件夹下,我们将登录页面命名为myLogin.html代码如下

<!--suppress ALL-->
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>springboot葵花宝典登录页面</title>
    <!-- Tell the browser to be responsive to screen width -->
    <meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<h1>springboot葵花宝典登录页面</h1>
<form  th:action="@{/login/form}" action="index.html" method="post">
    <span>用户名称</span><input type="text" name="username" /> <br>
    <span>用户密码</span><input type="password" name="password" /> <br>
    <div th:if="${param.error}">
        <span th:text="${session.SPRING_SECURITY_LAST_EXCEPTION.message}" style="color:#ff0000">用户名或 密码错误</span>
    </div>
    <input type="submit" value="登陆">
</form>
</body>
</html>


在configure(HttpSecurity http)自定义表单的配置

设置自定义登录页面以后,我们需要在configure(HttpSecurity http)设置相对应的配置

    /**
     * 资源权限配置(过滤器链):
     * 1、被拦截的资源
     * 2、资源所对应的角色权限
     * 3、定义认证方式:httpBasic 、httpForm
     * 4、定制登录页面、登录请求地址、错误处理方式
     * 5、自定义 spring security 过滤器
     * @param http
     * @throws Exception
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable() //禁用跨站csrf攻击防御,后面的章节会专门讲解
                .formLogin()
                .loginPage("/login/page")//用户的请求没有权限就跳转到登录页面
                .loginProcessingUrl("/login/form")//登录表单form中action的地址,也就是处理认证请求的路径
                .usernameParameter("username")///登录表单form中用户名输入框input的name名,不修改的话默认是username
                .passwordParameter("password")//form中密码输入框input的name名,不修改的话默认是password
                .and()
                .authorizeRequests()
                .antMatchers("/login/page").permitAll()//不需要通过登录验证就可以被访问的资源路径
                .anyRequest().authenticated();
    }


重启程序,再次访问localhost:8080,页面还是会自动跳转到http://localhost:8888/login,如图所示

mylogin.html页面中form表单中字段和configure(HttpSecurity http)配置的对应关系


441e6e173566dfb1718f46093cc5ca21.png


登录页面显示提示信息


当提交登录form认证失败的时候,通过http://localhost:8888/login/page?error进行重新定向登录页面,此时地址带有error参数,表示认证失败,默认情况下,提示信息为英文,但是也可以配置成中文

实现中文提示信息


在spring-security-core-x.x.x.jar下有国际化配置文件messages_xx.properties


默认ReloadableResourceBundleMessageSource加载了message.properties英文配置文件


手动实现加载指定messages_zh_CN.properties中文配置文件


在config包下创建SecurityMessageConfig

@Configuration
public class SecurityMessageConfig {
    @Bean // 加载中文的认证提示信息
    public ReloadableResourceBundleMessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        //.properties 不要加到后面
        messageSource.setBasename("classpath:org/springframework/security/messages_zh_CN");
        return messageSource;
    }
}


测试

重新启动项目,输入错误的用户信息,显示错误为用户或密码错误



如果您觉得本文不错,欢迎关注,点赞,收藏支持,您的关注是我坚持的动力!

目录
相关文章
|
2月前
|
安全 Java 数据库
安全无忧!在 Spring Boot 3.3 中轻松实现 TOTP 双因素认证
【10月更文挑战第8天】在现代应用程序开发中,安全性是一个不可忽视的重要环节。随着技术的发展,双因素认证(2FA)已经成为增强应用安全性的重要手段之一。本文将详细介绍如何在 Spring Boot 3.3 中实现基于时间的一次性密码(TOTP)双因素认证,让你的应用安全无忧。
108 5
|
4月前
|
SQL Java 测试技术
在Spring boot中 使用JWT和过滤器实现登录认证
在Spring boot中 使用JWT和过滤器实现登录认证
261 0
|
4月前
|
Java Spring
【Azure Spring Cloud】Spring Cloud Azure 4.0 调用Key Vault遇见认证错误 AADSTS90002: Tenant not found.
【Azure Spring Cloud】Spring Cloud Azure 4.0 调用Key Vault遇见认证错误 AADSTS90002: Tenant not found.
|
4月前
|
消息中间件 安全 Java
Spring Boot 基于 SCRAM 认证集成 Kafka 的详解
【8月更文挑战第4天】本文详解Spring Boot结合SCRAM认证集成Kafka的过程。SCRAM为Kafka提供安全身份验证。首先确认Kafka服务已启用SCRAM,并准备认证凭据。接着,在`pom.xml`添加`spring-kafka`依赖,并在`application.properties`中配置Kafka属性,包括SASL_SSL协议与SCRAM-SHA-256机制。创建生产者与消费者类以实现消息的发送与接收功能。最后,通过实际消息传递测试集成效果与认证机制的有效性。
164 4
|
4月前
|
Java Spring 安全
Spring 框架邂逅 OAuth2:解锁现代应用安全认证的秘密武器,你准备好迎接变革了吗?
【8月更文挑战第31天】现代化应用的安全性至关重要,OAuth2 作为实现认证和授权的标准协议之一,被广泛采用。Spring 框架通过 Spring Security 提供了强大的 OAuth2 支持,简化了集成过程。本文将通过问答形式详细介绍如何在 Spring 应用中集成 OAuth2,包括 OAuth2 的基本概念、集成步骤及资源服务器保护方法。首先,需要在项目中添加 `spring-security-oauth2-client` 和 `spring-security-oauth2-resource-server` 依赖。
56 0
|
6月前
|
存储 安全 Java
Spring Security 6.x OAuth2登录认证源码分析
上一篇介绍了Spring Security框架中身份认证的架构设计,本篇就OAuth2客户端登录认证的实现源码做一些分析。
250 2
Spring Security 6.x OAuth2登录认证源码分析
|
6月前
|
存储 安全 Java
Spring Boot中的OAuth2认证与授权
Spring Boot中的OAuth2认证与授权
|
6月前
|
安全 Java Spring
教程:在Spring Boot应用中集成OAuth 2.0认证
教程:在Spring Boot应用中集成OAuth 2.0认证
|
6月前
|
缓存 安全 Java
【权限管理系统】Spring security(三)---认证过程(原理解析,demo)
【权限管理系统】Spring security(三)---认证过程(原理解析,demo)
|
6月前
|
JSON 安全 Java
Spring Security 与 JWT、OAuth 2.0 整合详解:构建安全可靠的认证与授权机制
Spring Security 与 JWT、OAuth 2.0 整合详解:构建安全可靠的认证与授权机制
531 0