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日

相关文章

  • jsp利用POI生成Excel并在页面中导出的示例

    当需要在Java Web应用中实现Excel的导出时,结合JSP和POI是一个非常好的方案。下面是一份完整的JSP利用POI生成Excel并在页面中导出的攻略。 步骤1:添加POI依赖 首先需要将POI依赖添加到项目中,具体的引入方式根据具体的项目类型和构建工具而定。 例如,如果您使用Maven管理您的Java Web项目,可以在pom.xml中添加以下依赖…

    Java 2023年6月15日
    00
  • springboot整合JSR303参数校验与全局异常处理的方法

    下面我将详细讲解“springboot整合JSR303参数校验与全局异常处理的方法”的完整攻略。 一、JSR303参数校验 JSR303,又称Bean Validation,是一个JavaEE标准的框架,可以很方便地对JavaBean的字段进行校验,以保证数据的有效性和安全性。在springboot中,我们可以通过集成hibernate-validator来…

    Java 2023年5月19日
    00
  • 内存管理包括哪些方面?

    以下是关于内存管理包括哪些方面的完整使用攻略: 内存管理包括哪些方面? 内存管理是指操作系统或程序运行时如何管理计算机的内存资源。内存管理包括以下几方面: 内存分配 内存分配是指在程序运行时,为程序分配内存空间。内存分配的方式有多种,例如静态内存分配、动态内存分配等。 内存回收 内存回收是指在程序运行时,当不再需要使用某个内存空间时,将该内存空间释放出来,以…

    Java 2023年5月12日
    00
  • 详谈Java中的二进制及基本的位运算

    详谈Java中的二进制及基本的位运算 什么是二进制 二进制是一种采用0和1两个数码表示数字的方法,被广泛应用于计算机科学领域。在Java中,可以用整型变量存储二进制数。 在Java中,整型变量默认采用十进制存储,但是可以采用其他进制的数字进行初始化。例如: int num1 = 10; // 十进制 int num2 = 0b1010; // 二进制 int…

    Java 2023年5月27日
    00
  • 详解Spring Boot Mysql 版本驱动连接池方案选择

    下面我就详细讲解“详解Spring Boot Mysql 版本驱动连接池方案选择”的完整攻略。 一、Mysql 版本驱动 Mysql 版本驱动是连接 Mysql 数据库必不可少的一个组件。其作用是提供 Mysql 数据库的连接库,以便和应用程序进行交互。在选择连接 Mysql 数据库的驱动时,我们需要考虑以下几个方面: 驱动的版本与 Mysql 服务器的版本…

    Java 2023年6月16日
    00
  • Java进阶之FileUpload完成上传的实例

    Java进阶之FileUpload完成上传的实例 File Upload(文件上传)是Web应用程序中常用的功能之一,可以让用户将自己的文件上传到服务器。本文将介绍如何使用Java来实现文件上传功能。 实现流程 1.创建表单 首先,在前端编写一个表单,用来选择要上传的文件: <form action="upload" method=…

    Java 2023年6月2日
    00
  • Hibernate传入Java对象创建动态表并录入数据

    使用Hibernate可以通过Java对象自动创建表并进行数据录入,具体步骤如下: 添加相关依赖 在项目中添加Hibernate相关依赖,包括Hibernate Core和数据库驱动程序。 创建Java对象 创建一个Java对象,并使用Hibernate注解标识对象和属性,以指定对象如何与数据库交互。例如,创建一个User对象如下: @Entity @Tab…

    Java 2023年5月19日
    00
  • springmvc项目使用@Valid+BindingResult遇到的问题

    针对“springmvc项目使用@Valid+BindingResult遇到的问题”,我提供以下完整攻略: 1. 理解问题 经过实践和研究,我们发现当使用@Valid和BindingResult配合进行表单数据校验时,有时会遇到一些问题。 问题的根本原因在于BindingResult的处理方式与我们期望的不太一样,它不会使@Valid注解的校验失败,而是将校…

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