SpringSecurity使用JDBC认证

  数据库字段创建:

其中,必要字段为:username,password,enabled,role。

具体要求:

1.你设置的权限前缀放入数据库一定要加ROLE_,不然不会生效,enabled属性是用户是否生效1是0否

2.注意这里的密码通过jdbcAuthentication()验证一定要使用加密,不加密它识别不了

3.密码要进行加密,我是用的是BCryptPasswordEncoder()

 数据库例子:

环境配置:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

直接上代码:

创建一个SecurityConfig.java文件,把认证和授权放进去

鉴权:

package com.example.endwork.config;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

import javax.sql.DataSource;


/**
 * @author 
 * @version 1.0
 * @date 2023/3/28 15:43
 */

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    DataSource dataSource;
    //链式编程
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //首页任何人都可以访问,其他页面需要对应的权限才能访问
        //这是请求授权的规则
        http.authorizeRequests().antMatchers("/").permitAll()
                .antMatchers("/static/**").permitAll()
                .antMatchers("/login").permitAll()
                .antMatchers("/index").permitAll()
                .antMatchers("/sign").permitAll()
                .antMatchers("/register").permitAll()
                .antMatchers("/user/**").hasAnyRole("admin","user","business")
                .antMatchers("/business/**").hasAnyRole("admin","business")
                .antMatchers("/admin/**").hasRole("admin")
                .antMatchers("/v2/api-docs", "/swagger-resources/configuration/ui",
                        "/swagger-resources", "/swagger-resources/configuration/security",
                        "/swagger-ui.html", "/webjars/**").permitAll()
                        .anyRequest().authenticated();

        //没有权限会默认到登录页面,需要开启登录的界面
        http.formLogin().loginPage("/login").failureUrl("/login?error=true")
                .loginProcessingUrl("/user/login").usernameParameter("username").passwordParameter("password");//loginPage是自己配置一个首页

        //关闭csrf功能,开启的话可能会导致登录失败
        http.csrf().disable();

        //开启记住我的功能,储存在cookie里面,默认保持两周
        http.rememberMe();//接收来自前端的rememberMe参数

        //开启注销功能
        http.logout().logoutUrl("/user/logout").logoutSuccessUrl("/login");

    }

1.主要配置:antMatchers是设置请求路径,要请求这个路径则必须要什么样的权限,permitAll是任何人都可以请求,而使用了hasrole或hasanrole,则必须获取到对应的权限才能请求

2.登录功能配置:http中:loginPage是指登录失败后跳转到那个页面,failurUrl设置登录失败的跳转路径。

重点来了:loginPRocessingURL,是设置登录的请求路径,后面则是设置你提交账号的参数和密码的参数。想要提交到这个路径,必须是POST提交!!!!

认证:

  //这是用户认证
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        //这是添加认证权限的地方
         auth.jdbcAuthentication().passwordEncoder(new BCryptPasswordEncoder())
         .dataSource(dataSource)
         .usersByUsernameQuery("select username, password,enabled from user where username=?")
         .authoritiesByUsernameQuery("select username, role from user where username=?");


    }

注意事项:

1. @Autowired DataSource dataSource;这是从你的application.properties里面拿取的数据库连接配置,修改一下你自己的账号密码就可以了

#datasiurce
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.name=defaultDataSource
spring.datasource.url=jdbc:mysql://localhost:3306/JobBoard?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=123456

2.passwordEncoder是指定密码认证的方式,这代表你注册的时候,要先将密码进行加密,在存储

到这里基本上差不多了,这是前端的请求代码,form表单形式提交的

    <form action="/user/login" method="post" class="p-4 border rounded" name="loginForm">
    
              <div  th:if="${param.error}">
                <div class="alert alert-primary" role="alert">
                  <p class="text-center">账号或密码错误,请重新登录</p>
                </div>
              </div>

              <div class="row form-group">
                <div class="col-md-12 mb-3 mb-md-0">
                  <label class="text-black" for="fname4">Username</label>
                  <input type="text" id="fname4" name="username" class="form-control" placeholder="Username address">
                </div>
              </div>
              <div class="row form-group mb-4">
                <div class="col-md-12 mb-3 mb-md-0">
                  <label class="text-black" for="fname5">Password</label>
                  <input type="password" id="fname5" name="password" class="form-control" placeholder="Password">
                </div>
              </div>

              <div class="row form-group">
                <div class="col-md-12">
                  <input type="submit" value="Log In" class="btn px-4 btn-primary text-white">
                </div>
              </div>
              <div class="row form-group">
                <div class="col-md-12">
                  <button type="button" class="btn btn-link"><a href="/sign">注册</a></button>
                </div>
              </div>
              </div>

            </form>
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值