数据库字段创建:
其中,必要字段为: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>