概念
通过AOP的方式对请求的资源进行拦截,只有用户含有特定的权限才能被放行
导包(基于springboot)
org.springframework.boot
spring-boot-starter-security
后期使用mysql数据库进行认证
mysql
mysql-connector-java
org.springframework.boot
spring-boot-starter-jdbc
基于内存中的用户管理
首先因该自己写一个类继承WebSecurityConfigurerAdapter,加上@EnableWebSecurity注解,表明这是一个springsecurity的配置类
@EnableWebSecurity
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
//首页都可以访问
http.authorizeRequests()
.antMatchers("/", "/index").permitAll()
.antMatchers("/level1/**").hasRole("vip1");
http.formLogin();
http.logout().logoutSuccessUrl("/");
}
}
添加用户
可以通过重写WebSecurityConfigurerAdapter方法或者是添加bean的方法来添加用户对象
@Bean
public UserDetailsService users() {
UserDetails user = User.builder() //withDefaultPasswordEncoder不加密的方式(明文账号密码)
.username("user")
.password("{bcrypt}$2a$10$s41u/ZpT9Xe208wjPIsh4eFQsBzBnEblNDxVKxQvvbr2vCnkMsCp2") //加密方式,防止泄露源码
.roles("vip1")
.build();
return new InMemoryUserDetailsManager(user);
}
由于防止在反编译的时候获取密码,所以要使用加密,默认使用BCryptPasswordEncoder这个类实现加密,在设置密码的时候加上加密方式
在使用页面进行登入的时候就能实现自动识别和授权操作
基于数据库的认证(jdbc)
创建数据库(MySql)
通过更改脚本
CREATE TABLE `users` (
`username` varchar(50) NOT NULL,
`password` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`enabled` tinyint(1) NOT NULL,
PRIMARY KEY (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
CREATE TABLE `authorities` (
`username` varchar(50) NOT NULL,
`authority` varchar(50) NOT NULL,
UNIQUE KEY `ix_auth_username` (`username`,`authority`),
CONSTRAINT `fk_authorities_users` FOREIGN KEY (`username`) REFERENCES `users` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
添加用户
可以直接使用JdbcUserDetailsManager(datasource)进行添加
UserDetails user = User.builder() //withDefaultPasswordEncoder不加密的方式(明文账号密码)
.username("test")
.password("{bcrypt}$2a$10$s41u/ZpT9Xe208wjPIsh4eFQsBzBnEblNDxVKxQvvbr2vCnkMsCp2") //加密方式,防止泄露源码
.roles("vip1")
.build();
JdbcUserDetailsManager jdbcUserDetailsManager = new JdbcUserDetailsManager(dataSource);
jdbcUserDetailsManager.createUser(user);
验证用户
将JdbcUserDetailsManager(dataSource)添加到spring容器中就能自动读取数据库的用户和权限数据
@EnableWebSecurity
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
//首页都可以访问
http.authorizeRequests()
.antMatchers("/", "/index","/addUser").permitAll()
.antMatchers("/level1/**").hasRole("vip1");
http.formLogin();
http.logout().logoutSuccessUrl("/");
}
@Bean
public UserDetailsService users() { //内存中验证
UserDetails user = User.builder() //withDefaultPasswordEncoder不加密的方式(明文账号密码)
.username("user")
.password("{bcrypt}$2a$10$s41u/ZpT9Xe208wjPIsh4eFQsBzBnEblNDxVKxQvvbr2vCnkMsCp2") //加密方式,防止泄露源码
.roles("vip1")
.build();
return new InMemoryUserDetailsManager(user);
}
@Bean
public UserDetailsService users(@Autowired DataSource dataSource) { //数据库验证
return new JdbcUserDetailsManager(dataSource); //读取来自数据库的数据(同时可以添加用户)
}
}