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日

相关文章

  • JDBC连接SQL Server数据库实现增删改查的全过程

    JDBC(Java DataBase Connectivity)是Java语言中连接数据库进行操作的一种标准规范。下面是连接SQL Server数据库实现增删改查的全过程: 准备工作 安装SQL Server数据库,获取数据库的连接配置信息,包括地址、用户名、密码、端口等信息。 下载并安装SQL Server JDBC驱动,下载地址:https://docs…

    Java 2023年5月19日
    00
  • SpringBoot + SpringSecurity 短信验证码登录功能实现

    下面我将详细讲解“SpringBoot + SpringSecurity 短信验证码登录功能实现”的完整攻略。 一、准备工作 1. 创建SpringBoot工程 首先,我们需要创建一个SpringBoot工程。可以使用IDEA等常见开发工具,快速创建一个SpringBoot工程。 2. 引入依赖 在pom.xml文件中,我们需要添加如下依赖: <dep…

    Java 2023年5月20日
    00
  • Sprint Boot @PutMapping使用方法详解

    @PutMapping是Spring Boot中的一个注解,它用于将HTTP PUT请求映射到控制器方法上。在使用Spring Boot开发Web应用程序时,@PutMapping是非常重要的。本文将详细介绍@PutMapping的作用和使用方法,并提供两个示例说明。 @PutMapping的作用 @PutMapping的作用是将HTTP PUT请求映射到控…

    Java 2023年5月5日
    00
  • 数组实现Java 自定义Queue队列及应用操作

    数组实现Java 自定义Queue队列及应用操作 队列(Queue)是一种基本数据结构,它在算法和程序设计中得到了广泛应用。队列主要是用来存储和管理一系列元素,并在这些元素中进行插入和删除操作。本篇攻略将详细介绍如何用Java数组来实现自定义队列,并列举相应的应用操作。 Queue定义 队列最基本的功能就是FIFO(先进先出),可在队列尾插入一个元素,也可在…

    Java 2023年5月27日
    00
  • Spring Security权限管理实现接口动态权限控制

    以下是关于Spring Security权限管理实现接口动态权限控制的完整攻略: 1. 什么是接口动态权限控制 接口动态权限控制即根据用户的权限动态的对接口进行权限控制,这个过程可以分为两步:一是获取用户所拥有的权限,二是根据用户所拥有的权限动态的对接口进行控制。 2. Spring Security实现接口动态权限控制的步骤 以下是实现Spring Sec…

    Java 2023年6月3日
    00
  • Spring cloud alibaba之Ribbon负载均衡实现方案

    Spring Cloud Alibaba之Ribbon负载均衡实现方案 什么是负载均衡 在计算机网络中,负载均衡是指将任务或服务请求分摊给多个处理单元,例如计算机、网络、磁盘、存储设备,以达到最大的吞吐量,最小化响应时间,最大化可靠性,以及避免单点故障的目的。 为什么使用负载均衡 当一个系统需要处理大量的请求时,单个服务实例难以承受这样的压力。通过使用负载均…

    Java 2023年5月19日
    00
  • SpringMVC+Spring+Mybatis实现支付宝支付功能的示例代码

    这里是“SpringMVC+Spring+Mybatis实现支付宝支付功能”的完整攻略,包含示例代码。读者可以根据这个攻略来实现他们自己的支付宝支付功能。 概述 在这个攻略中,我们将使用SpringMVC、Spring和Mybatis框架,来实现一个支付宝支付功能的示例。我们会使用支付宝提供的SDK来操作支付宝的API接口。这个示例中会包括以下几个步骤: 在…

    Java 2023年6月15日
    00
  • 利用Spring MVC+Mybatis实现Mysql分页数据查询的过程详解

    下面是“利用Spring MVC+Mybatis实现Mysql分页数据查询的过程详解”的完整攻略。 准备工作 在实现分页查询之前,我们需要完成一些准备工作: 创建一个Spring MVC项目,并引入Mybatis、MySQL相关依赖。 创建数据库表,并插入一些测试数据。 实现分页查询 编写Mapper接口 我们先编写一个Mybatis的Mapper接口,其中…

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