Spring security基于数据库中账户密码认证

Spring Security是Spring框架中提供的一个安全权限框架。它将认证(Authentication)和授权(Authorization)抽象为一个独立的模块,可以快速地将安全性集成到应用程序中。Spring Security可以基于多种认证方式,包括基于数据库中账户密码的认证。

基于数据库中账户密码认证的Spring Security攻略如下:

1.配置Spring Security

在Spring配置文件中,添加Spring Security的依赖和配置信息,以启用Spring Security的安全性:

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>${spring-security.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>${spring-security.version}</version>
</dependency>

<security:http auto-config="true">
    <security:intercept-url pattern="/**" access="ROLE_USER" />
    <security:form-login login-page="/login" default-target-url="/home"
        authentication-failure-url="/login?error" />
    <security:logout logout-success-url="/login?logout" />
</security:http>    

<security:authentication-manager>
    <security:authentication-provider>
        <security:jdbc-user-service data-source-ref="dataSource"
            users-by-username-query="SELECT username, password, enabled FROM users WHERE username=?"
            authorities-by-username-query="SELECT u.username, a.authority FROM users u, authorities a WHERE u.username=? AND u.id=a.user_id" />
    </security:authentication-provider>
</security:authentication-manager>

在上面的代码中,<security:http>元素配置了应用程序的安全性,包括拦截URL规则、登录页面和默认路径等。<security:authentication-manager>元素配置了应用程序的认证方式,使用JDBC的用户服务实现,查询用户的账户、密码和角色等信息。

2.创建数据表

在数据库中创建用户表和授权表,用于存储用户的账户、密码和角色等信息:

CREATE TABLE users (
  id INT NOT NULL AUTO_INCREMENT,
  username VARCHAR(50) NOT NULL,
  password VARCHAR(100) NOT NULL,
  enabled TINYINT NOT NULL DEFAULT 1,
  PRIMARY KEY (id)
);

CREATE TABLE authorities (
  id INT NOT NULL AUTO_INCREMENT,
  user_id INT NOT NULL,
  authority VARCHAR(50) NOT NULL,
  PRIMARY KEY (id),
  CONSTRAINT fk_authorities_users FOREIGN KEY (user_id) REFERENCES users(id)
);

3.插入测试数据

插入测试数据,用于测试用户的认证和授权:

INSERT INTO users (username, password, enabled)
VALUES ('user1', '$2a$10$7l6V5AwMiVbvVn7oKVfYJ.LkNuaSmETcYliJOO1QX/0QFzuPzQSpC', true);

INSERT INTO authorities (user_id, authority)
VALUES (1, 'ROLE_USER');

在上面的代码中,$2a$10$7l6V5AwMiVbvVn7oKVfYJ.LkNuaSmETcYliJOO1QX/0QFzuPzQSpC是加密后的密码,使用BCrypt密码哈希算法生成。

4.基于数据库中账户密码认证的测试

使用新创建的账户测试基于数据库中账户密码认证的Spring Security,以下是基于Spring Boot的一个示例:

@Controller
public class HelloController {

    private Logger logger = LoggerFactory.getLogger(getClass());

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

    @GetMapping("/home")
    public String home() {
        return "home";
    }

    @GetMapping("/login")
    public String login() {
        return "login";
    }

    @GetMapping("/admin")
    public String admin() {
        return "admin";
    }

}

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    DataSource dataSource;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.jdbcAuthentication().dataSource(dataSource);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/", "/home").permitAll()
            .antMatchers("/admin").hasRole("ADMIN")
            .anyRequest().authenticated()
            .and()
            .formLogin()
            .loginPage("/login")
            .defaultSuccessUrl("/home")
            .permitAll()
            .and()
            .logout()
            .logoutSuccessUrl("/login?logout")
            .permitAll()
            .and()
            .exceptionHandling().accessDeniedPage("/403");
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

}

在以上代码中,创建了一个URL映射的控制器,并定义了认证和授权的配置类。
接下来,我们使用以下代码进行测试:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)
public class SecurityTest {

    @LocalServerPort
    private int port;

    TestRestTemplate restTemplate = new TestRestTemplate();

    HttpHeaders headers = new HttpHeaders();

    @Test
    public void test() throws JSONException {
        HttpEntity<String> request = new HttpEntity<>(headers);

        ResponseEntity<String> response = restTemplate.exchange(
          "http://localhost:" + port + "/", HttpMethod.GET, request, String.class);

        assertEquals(HttpStatus.OK, response.getStatusCode());

        response = restTemplate.exchange(
          "http://localhost:" + port + "/home", HttpMethod.GET, request, String.class);

        assertEquals(HttpStatus.OK, response.getStatusCode());

        response = restTemplate.exchange(
          "http://localhost:" + port + "/admin", HttpMethod.GET, request, String.class);

        assertEquals(HttpStatus.FORBIDDEN, response.getStatusCode());

        response = restTemplate.exchange(
          "http://localhost:" + port + "/login", HttpMethod.GET, request, String.class);

        assertEquals(HttpStatus.OK, response.getStatusCode());

        headers.add("Cookie", response.getHeaders().get("Set-Cookie").get(0));

        MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
        map.add("username", "user1");
        map.add("password", "password");

        request = new HttpEntity<>(map, headers);

        response = restTemplate.exchange(
          "http://localhost:" + port + "/login", HttpMethod.POST, request, String.class);

        assertEquals(HttpStatus.FOUND, response.getStatusCode());

        response = restTemplate.exchange(
          "http://localhost:" + port + "/admin", HttpMethod.GET, request, String.class);

        assertEquals(HttpStatus.FORBIDDEN, response.getStatusCode());

        response = restTemplate.exchange(
          "http://localhost:" + port + "/login?logout", HttpMethod.GET, request, String.class);

        assertEquals(HttpStatus.OK, response.getStatusCode());
    }

}

再次强调,以上示例为一个简单的示例,实际应用中应该更加完善和严谨。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring security基于数据库中账户密码认证 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Javaweb mybatis接口开发实现过程详解

    下面是我对 “Javaweb mybatis接口开发实现过程详解” 的完整攻略,以及包含两条示例。 Javaweb mybatis接口开发实现过程详解 mybatis整合步骤 导入mybatis和数据库驱动:在pom.xml中导入功能需要的依赖包,例如: <dependency> <groupId>org.mybatis</gr…

    Java 2023年5月20日
    00
  • Java利用Jackson序列化实现数据脱敏详解

    下面我就向您介绍一下Java利用Jackson序列化实现数据脱敏的攻略。 背景 随着大数据时代的到来,在数据采集和存储方面,数据隐私和安全问题变得愈发重要。对于某些敏感数据,为了保护用户隐私,往往需要进行脱敏处理。而在Java开发中,常用的序列化工具是Jackson,本攻略将介绍如何使用Jackson实现常见的数据脱敏。 操作步骤 1.添加依赖 首先需要在项…

    Java 2023年5月26日
    00
  • Jaspersoft Studio添加mysql数据库配置步骤

    下面我来详细讲解“Jaspersoft Studio添加mysql数据库配置步骤”的完整攻略,过程中我将会包含两条示例说明。 1. 下载MySQL JDBC驱动程序 Jaspersoft Studio需要通过JDBC连接到MySQL数据库,因此需要下载MySQL JDBC驱动程序。在MySQL官网下载页面(https://dev.mysql.com/down…

    Java 2023年6月16日
    00
  • java 使用JDBC构建简单的数据访问层实例详解

    下面我来详细讲解如何使用Java JDBC构建简单的数据访问层实例。 1. JDBC概述 Java数据库连接(Java Database Connectivity,简称JDBC),是Java语言中用来规范客户端程序如何访问数据库的应用程序接口,目前最新版是JDBC 4.3。 JDBC API提供了访问多种关系型数据库的标准方法,包括连接数据库、执行SQL语句…

    Java 2023年5月19日
    00
  • Java SpringBoot 中,动态执行 bean 对象中的方法

    根据不同的条件,调用不同的 bean 对象,执行对象中的方法 SpringUtils 工具类 package com.vipsoft.web.utils; import cn.hutool.core.util.ArrayUtil; import org.springframework.aop.framework.AopContext; import org.…

    Java 2023年4月17日
    00
  • 关于@JsonProperty,@NotNull,@JsonIgnore的具体使用

    @JsonProperty、@NotNull和@JsonIgnore都是Jackson库(一个用于在Java中快速处理JSON数据的库)中的注解,它们的具体使用如下: @JsonProperty @JsonProperty注解用于在JSON对象和Java对象之间进行属性映射。当Java对象的属性名称与JSON对象的键名称不一致时,可以使用@JsonPrope…

    Java 2023年5月26日
    00
  • springboot整合JPA过程解析

    下面是对“springboot整合JPA过程解析”的完整攻略。 一、JPA介绍 JPA是Java Persistence API的缩写,是JavaEE环境下的持久化框架。它的目标是提供一种简单、统一的持久化方式,使得开发人员不需要过多关注数据访问细节,只需要关注业务逻辑的实现。 二、Spring Boot整合JPA 创建Maven项目并添加Spring Bo…

    Java 2023年6月1日
    00
  • Java使用IntelliJ IDEA连接MySQL的详细教程

    下面我会给出Java使用IntelliJ IDEA连接MySQL的详细教程: 1. 下载安装MySQL 首先你需要下载并安装MySQL数据库,可以到官网上下载最新的稳版本,安装过程中需要自己设置root账户的密码。 2. 下载安装IntelliJ IDEA 接下来你需要下载并安装IntelliJ IDEA,可以到官网上下载最新的Community版本,社区版…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部