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

yizhihongxing

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日

相关文章

  • Java异常处理与throws关键字用法分析

    Java异常处理与throws关键字用法分析 异常处理概述 在 Java 中,异常处理是指程序在执行期间可能出现的“异常事件”,如:文件损坏、网络中断等。当出现异常事件时,程序会中止,除非在代码中特殊处理它们。 Java 中提供了 try…catch…finally 块来实现异常处理,其中 try 块用于包含可能出现异常的代码,catch 块用于捕获…

    Java 2023年5月27日
    00
  • Spring boot2.0 日志集成方法分享(1)

    Spring Boot2.0 日志集成方法分享(1) 在Spring Boot2.0中,我们可以使用多种方式来集成日志框架,如Logback、Log4j2、Java Util Logging等。本文将详细讲解Spring Boot2.0日志集成方法的完整攻略,并提供两个示例。 1. 集成Logback 以下是集成Logback的基本流程: 在pom.xml文…

    Java 2023年5月15日
    00
  • Java中Object类常用的12个方法(小结)

    Java中Object类常用的12个方法(小结) 在Java中,Object类是所有类的根类,其包含了许多常用的方法。以下是Java中Object类常用的12个方法: equals equals方法用来比较两个对象是否相等。默认情况下,equals方法比较的是对象的引用地址,即比较的是两个对象是否是同一个对象。如果我们希望比较它们的内容是否相等,就需要在自定…

    Java 2023年5月26日
    00
  • springboot升级过程中踩坑定位分析记录 | 京东云技术团队

    作者:京东零售 李文龙 1.背景 “ 俗话说:为了修复一个小bug而引入了一个更大bug ” 因所负责的系统使用的spring框架版本5.1.5.RELEASE在线上出过一个偶发的小事故,最后定位为spring-context中的一个bug导致的。 为了修复此bug进行了spring版本的升级,最终定的版本为收银台团队使用的版本5.2.12.RELEASE,…

    Java 2023年4月30日
    00
  • Jsp+Servlet实现文件上传下载 文件列表展示(二)

    下面就为您详细讲解“Jsp+Servlet实现文件上传下载 文件列表展示(二)”的完整攻略: 一、项目说明 本项目旨在通过Jsp和Servlet实现Web应用程序中的文件上传下载及文件列表展示功能。具体步骤如下: 搭建Web应用程序环境; 实现文件上传功能; 实现文件下载功能; 实现文件列表展示。 二、搭建Web应用程序环境 新建一个Web项目,命名为fil…

    Java 2023年6月15日
    00
  • 程序计数器的作用是什么?

    程序计数器(Program Counter)是一种在 Java 虚拟机中使用的寄存器,用于存储当前线程正在执行的字节码指令的地址。程序计数器是线程私有的,每个线程都有自己的程序计数器。程序计数器不会发生 OutOfMemoryError 异常。 以下是程序计数器的完整使用攻略: 记录当前线程执行的字节码指令地址 在 Java 虚拟机中,程序计数器用于记录当前…

    Java 2023年5月12日
    00
  • tomcat 集群监控与弹性伸缩详解

    Tomcat 集群监控与弹性伸缩详解 1. Tomcat 集群概述 在 Tomcat 集群中,Tomcat 服务器可以分为主/从节点,主节点负责接收用户请求并将请求转发到从节点上,从节点负责处理具体的业务逻辑。Tomcat 集群可以提高系统的性能和可用性,并且还支持弹性伸缩功能。 2. Tomcat 集群监控 为了保证 Tomcat 集群的正常运行以及及时发…

    Java 2023年5月20日
    00
  • Java通过PropertyDescriptor反射调用set和get方法

    Java通过 PropertyDescriptor 反射调用 set 和 get 方法可以让我们通过字符串的形式来动态地调用一个对象的属性。下面是详细的攻略: 一、引入所需依赖 在项目的 pom.xml 文件中引入 commons-beanutils 依赖,以便使用 PropertyDescriptor 类: <dependency> <g…

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